Autor Zpráva
grimword
Profil
Potřeboval by jsem poradit, jak napsat co nejefektivnější (nejjednodušší) MySQL dotaz.

Struktura tabulky
id------zvire

1------pes
2------kocka
3------kocka
4------pes
5------kocka
6------kocka

Požadovaný výsledek
[počet] čeho


[2]pes
[4]kočka

nejlépe řazeno dle abecedy zvířete
Joker
Profil
SELECT zvire, COUNT(id) FROM tabulka GROUP BY zvire ORDER BY zvire
ninja
Profil
grimword: pokud chcete jit do detailu, je potreba analyzovat cetnost opakovani a jedinecnost hodnot ve sloupci zvire a v pripade casteho opakovani predelat strukturu na id--zvire_id JOIN zvire_id--zvire.

V kazdem pripade nasadit na sloupec zvire index.
grimword
Profil
pokud chcete jit do detailu, je potreba analyzovat cetnost opakovani a jedinecnost hodnot ve sloupci zvire a v pripade casteho opakovani predelat strukturu na id--zvire_id JOIN zvire_id--zvire

není mi moc jasné, jak by jsem měl tabulku předělat, a jak by měl poté vypadat dotaz?


SELECT zvire, COUNT(id) FROM tabulka GROUP BY zvire ORDER BY zvire

proč zrovna count(id)?
grimword
Profil
prosím:)
Kajman_
Profil *
proč zrovna count(id)?

Stejný výsledek dá i count(*) a pokud nemůže být zvíře null, tak i count(zvire)
Joker
Profil
grimword:
proč zrovna count(id)?
Proč ne? :-)
Když počítám řádky, vždycky podle primárního klíče... podle něčeho se počítat musí a primární klíč je nejlepší kandidát. Navíc ta tabulka má jen dva sloupce, takže zrovna velký výběr není :-)

Jak píše Kajman, šlo by použít i count(*), ale žiju v naprosto neověřeném (a možná tedy mylném) dojmu, že count(id) bude rychlejší, než count(*).
grimword
Profil
díky vaší pomoci úspěšně vyřešeno
Joker
Profil
Pro zajímavost doplním, že jsem vyzkoušel to count(id) vs count(*) na své zkušební databázi a výsledky jsou takové neurčité.
Vypadá to, že pro tabulky v pevném formátu je o něco rychlejší count(*), zatímco pro tabulky v dynamickém formátu o něco rychlejší count(id)
(metodika: pevná testovací tabulka INT (PK) - INT, dynamická INT (PK) - INT - VARCHAR(5), každá 10 000 záznamech, dotazy:
SELECT count(*) FROM tabulka t JOIN tabulka t1 WHERE t1.id > 5000 -- respektive t1.id místo *
...čili ve výsledku se počítalo 50 milionů řádků ze 100 milionů)

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: