Null sloupce u (inner) join

Michal Kubecek mike na mk-sys.cz
Pátek Listopad 8 19:35:34 CET 2002


On Thu, Nov 07, 2002 at 10:43:59AM +0100, Zdeněk Böhm wrote:
> 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?

Možná jsem trochu mimo (za poslední dva dny jsem deset hodin spal
a šestnáct hodin přednášel), ale připadá mi, že se to snažíte dělat
zbytečně složitě. Tohle by mělo stačit:

select N.Nab_Id, O.Odp_Id, U.Usr_Name from Nabidky N
  left join Odpovedi O on O.Nab_id=N.Nab_Id
  left join Uzivatele U on U.Usr_Id=N.Usr_id

                                                     Michal Kubeček


Další informace o konferenci Test