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