Autor Zpráva
lionel messi
Profil
Zdravím,

narazil som na pre mňa neočakávané správanie poddotazu v kombinácii s NOT IN a GROUP BY v hlavnom poddotaze.

Povedzme, že mám tabuľku hraci_goly, kam ukladám čosi takéto:

hrac                  |    zapas
Lionel Messi      |   ARG - SER 2006
Lionel Messi      |   ARG - NIG 2018
Miroslav Klose   |   GER - BRA 2014

V inej tabuľke neaktivni_hraci mám uložených neaktívnych hráčov. A teraz chcem na základe týchto 2 tabuliek vybrať 3 aktívnych hráčov, ktorí dali najviac gólov. Ak by som vyberal všetkých hráčov, vyzeralo by to takto:

SELECT hrac, COUNT(hrac) AS gol 
FROM hraci_goly 
GROUP BY hrac 
ORDER BY gol 
DESC LIMIT 3

Výsledok:
Miroslav Klose 16
Ronaldo 15
Gerd Müller 14

Keďže na vrchole takéhoto rebríčka sú iba neaktívni hráči, chcem ich vylúčiť takto:

SELECT hrac, COUNT(hrac) AS gol 
FROM hraci_goly 
WHERE hrac NOT IN (
  SELECT hrac FROM neaktivni_hraci
  ) 
GROUP BY hrac 
ORDER BY gol DESC 
LIMIT 3

Tento dotaz by mi mal vrátiť celkom iných hráčov:

Thomas Müller 10
Luis Suárez 7
Cristiano Ronaldo 7

V skutočnosti však vracia:

Ronaldo 15
Gerd Müller 14
Just Fontaine 13

čiže vylúči iba jedného neaktívneho hráča. Nedokážem prísť na chybu. Ak si spustím poddotaz bez hlavného dotazu, vráti správne všetkých neaktívnych hráčov. Vopred ďakujem za nasmerovanie.

PS: Predvedeným databázovým návrhom sa nemusíte zaoberať, s hráčmi a gólmi je to len uletený príklad, v skutočnosti majú dáta celkom inú povahu.
Kajman
Profil
Data nebudou stejná. Např. mezera, enter atp.

Edit: pro kontrolu lze použít např. funkci hex
select distinct hex(hrac) from neaktivni_hraci where hrac like '%onald%';
select distinct hex(hrac) from hraci_goly      where hrac like '%onald%';
lionel messi
Profil
Kajman:
Např. mezera, enter atp.

Ďakujem, je tam na konci medzera, na jednom mieste v aplikácii som v PHP zjavne zabudol na orezanie bielych znakov (trim).

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:

0