Autor Zpráva
BunnyBugs
Profil *
Zdravím, potřebuji poradit. Proč mi to při volání z databáze vypíše vždy poslední řádek jednotlivé skupiny id?
Náhled kódu:

SELECT *, COUNT(*) FROM `table1` GROUP BY `id_sloupec1` ORDER BY `id_uzivatel` ASC

Kde id_sloupec jsou jednotlivé skupiny a id_uzivatel je čistě jen číslo auto increment.
Ve výpise potřebuji, aby mi to vypsalo vždy jen první řádek + počet, kolik uživatelů pro danou skupinu je přihlášeno.
juriad
Profil
BunnyBugs:
To který řádek vrátí neovlivníš, dokonce ani nemusí vrátit všechna pole z jednoho jediného řádku. Ten tvůj dotaz totiž odporuje standardu SQL. V MySQL ti to projde, ale nic ti negarantuje.
Jak poznáš, který řádek je první ve skupině? Má nejmenší id_uzivatel?

Inspiruj se dotazy:
Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení řádků s maximální (minimální) hodnotou
BunnyBugs
Profil *
Jojo, ten první řádek má vždy nejnižší id ... prostě mi to nějak nefunguje :(
Teda na localhostu je to v pořádku a když to nahraju na server, tak to vypíše vždy ten poslední řádek :(


Nicméně řazení ORDER BY ASC je přece vzestupně, tak proč to tak neřadí?
Používám MySQL a nevím, kde by mi to odporovalo standartu :(
peta
Profil
BunnyBugs:
Pridej sem link na soubor s exportem z db. Pripadne jednoduchy cely priklad? Jde o to, ze na serveru mas mozna skutecne jine cislo id_uzivatel, nejspis. Zkus se podivat na tabulky v phpmyadminu.

"Nicméně řazení ORDER BY ASC je přece vzestupně, tak proč to tak neřadí? "
Vypis si do tabulky vyspupu take id_uzivatele.

juriad
"Ten tvůj dotaz totiž odporuje standardu SQL"
Tomu nerozumim. Ten dotaz je uplne normalni sql dotaz. Jediny problem vidim v ORDER BY `id_uzivatel` ASC, ktere se muze menit pri kazde optimalizaci tabulky (phpmyadmin > upravy > Optimalizovat tabulku). Pro serazeni podle prvniho registrovaneho uzivatele bych pouzil sloupec s datumem registrace.
juriad
Profil
Tam jde o klauzuli GROUP BY. Kdyz ji pouzijes, tak vsechny vracene sloupce musi byt uvedene v te klauzili nebo musi byt vysledkem agregacni funkce. Jinak Neni nikde receno jakou hodnotu ma databaze vybrat za reprezentanta skupinky.


ORDER BY se provadi az nad vysledkem dotazu. V okamziku, kdy uz jsou vysledne radky sestavene. Tato klauzule tedy nemuze ovlivnit poradi ani vyber hodnoty uvnitrskupinky.
Zmenit poradi provadenych operace databaze smi, pokud dokaze, ze vysledek bude ekvivalentni.


Správný dotaz je:
SELECT t.*, s.pocet
FROM table1 t
JOIN (
  SELECT MIN(id_uzivatel) uzivatel, COUNT(*) pocet
  FROM table1
  GROUP BY id_sloupec1
) s ON t.id_uzivatel = s.uzivatel
ORDER BY t.id_uzivatel
BunnyBugs
Profil *
No, šlo to vyřešit pouhým řazením v phpmyadminu. Když jsem dal řazení podle id_uzivatel, tak to funguje, nedošlo mi totiž, že to tak musím v adminu mít nastavené.
V podstatě skupina id_sloupec1 je vždy založena jako první, v podstatě je to něco jako nadpis, takže vždy bude mít id_uzivatel nejmenší a tím pádem bude teď už vždy na prvním řádku.
Nicméně děkuji za rady, protože tím mě to nakoplo a vyřešil jsem to :)

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: