Autor | Zpráva | ||
---|---|---|---|
simonik Profil * |
#1 · Zasláno: 27. 5. 2013, 13:27:32
Ahoj,
dostávám nějaké divné výyledky při použití MIN. Mám : select MIN(poradi),`album`,poradi,id from s281_photos where`album` = "Kohutka 1.5.2001"; a vrátí to : MIN(poradi) album poradi id 1 Kohutka 1.5.2001 7 293 Přitom, když to vráti Minimální hodnotu pořadí jako 1 (která je správná), tak proč je ve sloupci poradi 7 a ne ta 1? Já to mám použité pak v GROUP BY, kde mi taky sveřepě vrací poradi 7. Čím to je? |
||
DJ Miky Profil |
Protože ten dotaz říká "vyber minimální pořadí a řádek s jakýmkoliv pořadím" (vyhraje řádek, který je v databázi fyzicky uložený jako první, což může být v podstatě jakýkoliv). Pokud chceš hodnoty z řádku s nejnižším pořadím, doplň
ORDER BY poradi LIMIT 1 .
Aby sis to lépe představil, vyhoď z dotazu to MIN(poradi). Pak uvidíš, že nikde nespecifikuješ, který řádek vybrat, proto databáze vezme první, na který narazí. A potom k němu nezávisle přidá hodnotu MIN(poradi). (I když takto zapsané vrátí všechny řádky, protože tam nemáš LIMIT 1.) |
||
juriad Profil |
Group by vytvoří množinu řádků, které mají některou hodnotu společnou (podle klauzule GROUP BY) a ty musíš z dané množiny řádků vytvořit jeden řádek.
Sloupečky, které byly součástí klauzule GROUP BY (tedy ty, které sdílejí stejnou hodnotu) můžeš uvést rovnou, ale na ostatní sloupečky, ve kterých se řádky liší, musíš (podle specifikace jazyka SQL, podle MySQL nemusíš, ale je to dobrá praxe) uvést AGREGAČNÍ funkci (například to MIN). tabulka(cena, znacka, model, barva): 250, škoda, fabia, modrá 230, škoda, fabia, červená 300, škoda, oktavia, červená 400, vw, golf, zelená 420, vw, golf, žlutá 200, vw, polo, červená Dotaz není SQL-validní a nelze předpovědět, jaká hodnota bude ve sloupečku barva SELECT MIN(cena), znacka, model, barva FROM tabulka GROUP BY (znacka, model) Pokud bys chtěl u nejlevnějšího záznamu i barvu, tak si ji musíš až následně přijoinovat: SELECT minima.mincena, minima.znacka, minima.model, tabulka.barva FROM tabulka JOIN (SELECT Min(cena) AS mincena, znacka, model FROM tabulka GROUP BY znacka, model) minima ON ( minima.mincena = tabulka.cena AND minima.znacka = tabulka.znacka AND minima.model = tabulka.model ) |
||
simonik Profil * |
#4 · Zasláno: 27. 5. 2013, 14:21:12
Tak to jsem z toho nějaký hotový.
Já mám ted tabulku : id,album,poradi,datum. Tabulka není vhodně navrženám, takže se opakuje název alba a je u něho různé id. Chci vypsat seznam alb , ale přitom vybrat takové, které má nejnižší hodnotu ve sloupci poradi a ten seznam má být setříděný podle datumu. Je to ten případ? |
||
nounejm Profil * |
#5 · Zasláno: 27. 5. 2013, 14:28:41
Chci vypsat seznam alb , ale přitom vybrat takové, které má nejnižší hodnotu ve sloupci poradi
- to znamená, že těch alb s nejnižší hodnotou je víc? - anebo vypsat pouze jedno album s nejnižší hosnotou? |
||
simonik Profil * |
#6 · Zasláno: 27. 5. 2013, 14:32:52
tak toto vrací žádný řádek
select tab.album,tab.id,tab.poradi from s281_photos tab JOIN (SELECT album,MIN(poradi) por FROM s281_photos GROUP BY album) minima ON tab.album = minima.album AND tab.album = minima.por; |
||
nounejm Profil * |
#7 · Zasláno: 27. 5. 2013, 14:34:29
Vypíšu všechna alba od nejmenšího poradi. Pokud mají stejné poradi setřídí se ještě podle data:
SELECT poradi, album, id from s281_photos ORDER BY poradi ASC, datum ASC .....(nebo DESC) SELECT poradi, album, id from s281_photos WHERE poradi = MIN(poradi) ORDER BY poradi ASC, datum ASC .....(nebo DESC) |
||
simonik Profil * |
#8 · Zasláno: 27. 5. 2013, 14:38:31
Jejda , jsem se přepsal. Už to funguje. Díky
select tab.album,tab.id,tab.poradi from s281_photos tab JOIN (SELECT album,MIN(poradi) por FROM s281_photos GROUP BY album) minima ON (tab.album = minima.album AND tab.poradi= minima.por); |
||
Časová prodleva: 11 let
|
0