Autor Zpráva
simonik
Profil *
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 *
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 *
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 *
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 *
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)
Vypíšu všechna alba s nejmenším poradi a setřídí se ještě podle data:
SELECT poradi, album, id from s281_photos WHERE poradi = MIN(poradi) ORDER BY poradi ASC, datum ASC  .....(nebo DESC)
simonik
Profil *
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);

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: