Autor Zpráva
frank768
Profil *
Ahoj,

jednoduchý příklad:

SELECT * FROM tabulkaA
LEFT JOIN tabulkaB
ON tabulkaB.tabulkaA_id = tabulkaA.id
WHERE (tabulkaB.value IN ('a', 'b'))
AND (tabulkaB.value IN ('c', 'd'))

Tento zápis je chybný, vrací 0 řádků. Potřebuji, aby navrátil vše z tabulky tabulkaA propojenou přes tabulku tabulkaB, kde bude hodnota "value" buď "a" a/nebo "b" a zároveň bude v tabulce tabulkaB hodnota "c" a/nebo "d". Jde o velké zjednodušení jiného dotazu, ale princip je podobný. Pokud ostraním první podmínku (tabulkaB.value IN ('a', 'b')) tak to vraci jeden proukt stejný jako když odstraním druhou podmínku, když ale nechám obě, nevrací se nic. Potřeboval bych průnik těch dvou podmínek.

Netušíte někdo?
frank768
Profil *
hm, tak to v mysql nepůjde, MySQL nepodporuje INTERSECT a vzhledem k tomu, ze cely dotaz je propojeni 7 tabulek, pravdepodobne to nepujde jinak nez prejit na jinou db.
Kajman_
Profil *
Spíš máte překlep v názvu tabulky

(tabulkaB.value IN ('a', 'b')) AND (tabulkaB.value IN ('c', 'd'))

nebude nikdy vyhovovat, v tom prvním výraze má být asi tabulkaA.
ninja
Profil
pokud se jedna o left join, tak by to melo byt "(tabulkaB.value in ('a','b') or tabulkaB is null)"
Kajman_
Profil *
ninja
To už je jednodušší dát tu podmínku také do on místo where.
frank768
Profil *
Nene, je to správně, našel jsem řešení na http://interval.cz/clanky/sql-skladani-dotazu/ v odstavci Průnik dotazů. Tohle je jen velmi zjednodušená verze dotazu, ale princip zůstává stejný, potřeboval bych nějak nahradit INTERSECT. Šlo by to přepsat pomocí subselectu jako že vyberu ID u prvni podminky a pak vytvořím druhý dotaz s druhou podminkou, který doplním o výsledky z prvního dotazu a z nich pak vybírám. Atd., těch subselectů může být neomezeně. Ale není to dvakrát dobré řešení, ovšem jiné mě nenapadá. Každopádně děkuji za pomoc.
joe
Profil
Zdá se mi to stejně jako píše Kajman_.

To by uvedený dotaz mohl být

SELECT * FROM tabulkaA
LEFT JOIN tabulkaB
ON tabulkaB.tabulkaA_id = tabulkaA.id
WHERE (tabulkaB.value IN ('a', 'b','c','d'))
frank768
Profil *
Ten dotaz je rozdělený tak, aby vybral buď hodnotu "a" nebo "b" a zároveň buď hodnotu "c" nebo "d", to bohužel tento dotaz nesplňuje.
joe
Profil
A co to napsat tímto způsobem?

SELECT * FROM tabulkaA
LEFT JOIN tabulkaB
ON tabulkaB.tabulkaA_id = tabulkaA.id
WHERE
(tabulkaB.value = 'a' OR tabulkaB.value = 'b')
AND
(tabulkaB.value = 'c' OR tabulkaB.value = 'd')

Ale stejně to fungovat nebude, protože to nedává vůbec žádnou logiku :)
Kajman_
Profil *
A nechcete náhodou ty hodnoty hledat na různých řádcích? Pak by to mohlo být něco jako

select * from tabulkaA a where
a.id in (select tabulkaA_id from tabulkaB b where b.value in ('a','b'))
and
a.id in (select tabulkaA_id from tabulkaB b where b.value in ('c','d'))

případně si můžete tu tabulkuB přijoinovat dvakrát.
frank768
Profil *
Popsal jsem to asi spatne, omlouvam se. Dam lepší příklad. Představte si katalog aut, u každého auta je možné specifikovat x parametrů a každý parametr je číselník, který má několik hodnot. Např. Fabia bude mít parametr Počet dvěří a z číselníku se vybere jak Třídvéřový", tak "Pětidvéřový".

Vytvořím si tyto tabulky:

Auta
- id
- nazev

Parametry
- id
- nazev

Parametry_Číselníky
- id
- hodnota

Auta_Parametry
- id
- Auta_id
- Parametry_id

Auta_Parametry_Číselníky
- Auta_Parametry_id
- Parametry_Číselníky_id

V tabulce Auta bude záznam: 1, Fabia
V tabulce Parametry bude záznam: 1, Počet dvěří
V tabulce Parametry_Číselníky bude záznam: 1, Třídvéřový; 2, Čtyřdvéřový; 3, Pětidvéřový
V tabulce Auta_Parametry bude záznam: 1, 1, 1
V tabulce Auta_Parametry_Číselníky bude záznam: 1, 1; 1, 3;

No a teď potřebuji vybrat všechny auta, které mají parametr Počet dvěří s hodnotou Třídvéřový nebo Pětidvéřový. To by bylo jednoduché, ale pak tam budpou další parametry (Motor, Barva, Počt kol:-) atd. Asi jediný způsob je vybrat nejprve IDčka aut Třídvéřových či Pětidvéřových, pak vybírat třeba barvu auta přičemž se přidá podmínka IN (vysledek prvního dotazu) atd. Při 30 parametrech to ale už bude hodně dotazů a ta tabulka Auta_Parametry_Číselníky bude hodně růst a vyhledávání bude nejspíš pomalé. Nenapadá vás, jak tohle elegantně řešit?
Kajman_
Profil *
Uděláte 30x tu podmínku and auto.id in (select seznam aut vyhovujici jedne podmince).

Když chcete složité podmínky, tak většinou bývají i složitě zapsané dotazy.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: