Null sloupce u (inner) join
Zdeněk Böhm
zdenek.bohm na gammarus.cz
Čtvrtek Listopad 7 10:43:59 CET 2002
Ahoj,
potreboval bych, prosim, poradit s nasledujici situaci:
na MySQL mam tabulky Nabidky, Odpovedi a Uzivatele. Jedna se o hru, kde se
smenuji suroviny, ale to neni ted tak podstatne. V tabulce Nabidky jsou
ulozeny nabidky ke smene surovin. Kazdy zaznam je identifikovan jednoznacnym
identifikatorem - Nab_Id. V tabulce Odpovedi jsou odpovedi ostatnich hracu
na konkretni nabidku v tabulce Nabidky - provazanost je pres Nab_Id, k jedne
nabidce muze byt nekolik odpovedi. Potrebuju vypsat vsechny Nabidky is
odpovedmi. Zatim je to jednoduche:
SELECT Nab_Id, Odp_Id, (dalsi sloupce...) FROM Nabidky LEFT JOIN Odpovedi ON
Nabidky.Nab_Id=Odpovedi.Nab_Id
Dotaz vypise vsechny nabidky s odpovedmi a u tech, ktere nemaji odpoved je
Odp_Id NULL.
Vsechno se ale komplikuje tim, ze v tabulce Odpovedi je ulozeno Id uzivatele
(Usr_Id), ktery na nabidku odpovida. Pres toto Id je tabulka provazana s
tabulkou Uzivatele, kde ma kazdy uzivatel zaznam a je zde ulozeno krome
dalsich informaci i jmeno dotycneho.
No, a ja bych potreboval vypsat vsechny nabidky i s odpovedmi a u odpovedi i
jmena uzivatelu, kteri odpovedeli. Ovsem dotaz:
SELECT Nab_Id, Odp_Id, Usr_Name FROM Nabidky,Uzivatele LEFT JOIN Odpovedi ON
Nabidky.Nab_Id=Odpovedi.Nab_Id WHERE Odpovedi.Usr_Id=Uzivatele.Usr_Id
Ma jednu nevyhodu. V pripade, ze k nabidce neexistuje odpoved (a tudiz
Odpovedi.Usr_Id je NULL) do vysledku se nezaradi ani samotna nabidka. V
pripade, ze zkusim WHERE upravit takto:
WHERE (Odpovedi.Usr_Id=Uzivatele.Usr_Id) OR Odpovedi.Usr_Id IS NULL
tak se mi do vysledku sice nabidka zahrne (s Odp_Id NULL), ale tolikrat,
kolik je zaznamu v tabulce Uzivatele a to nechci. Jina forma dotazu, abych
"vydojil" patricne vysledky, me nenapada. Muzete me, prosim, trochu
nakopnout?
Diky Zdenek Bohm
Další informace o konferenci Databases