Autor | Zpráva | ||
---|---|---|---|
lionel messi Profil |
#1 · Zasláno: 22. 2. 2020, 12:18:50
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 |
#3 · Zasláno: 22. 2. 2020, 20:32:05
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). |
||
Časová prodleva: 5 let
|
0