Autor Zpráva
PetraPP
Profil
Nemůžu přijit na mySQL příkaz, který by nevypisoval již vypsané hodnoty. Tedy A,A,A,B,B,B,B,C,D,D,D -> A,B,C,D...
SELECT SUBSTRING(seo,1,1) as pismeno FROM prijmeni ORDER BY pismeno
juriad
Profil
přidej DISTINCT
jefitto44
Profil
PetraPP:
SELECT SUBSTRING(seo,1,1) as pismeno FROM prijmeni GROUP BY pismeno ORDER BY pismeno
Ivan M.
Profil *
No vidíte, to jsem se chtěl nedávno také podívat po tom, jaký je rozdíl mezi těmito dvěma volání:

1) SELECT DISTINCT(sloupec) AS sloupec FROM tabulka
2) SELECT sloupec FROM tabulka GROUP BY sloupec

Kdyby někdo dal vědět, byl bych rád. Děkuji
juriad
Profil
Ivan M.:
Pozor na to, že DISTINCT není funkce, tedy tvůj první dotaz je ekvivalentní: SELECT DISTINCT sloupec AS sloupec FROM tabulka
Rozdílů je několik, nikoli funkčních. Alespoň podle mě.

GROUP BY je princip jak pracovat s agregačními funkcemi po skupinách záznamů a nikoli pro celou tabulku. Podle standardu SQL musí všechny vrácené sloupce záznamu být buď součástí GROUP BY klauzule, nebo výsledkem agregační funkce. Vedlejším efektem, v případě, že záznam se několikrát opakuje a jsou uvedeny všechny žádané sloupce, je jeho zunikátnění.

DISTINCT znamená, že každý záznam má být vrácen jen jednou. Unikátnost je požadována přes všechny sloupce. Jde tedy o vysokoúrovňový požadavek, který může databáze realizovat jakkoli se jí zlíbí; GROUP BY je jednou z možností. Databáze ale třeba může poznat, že nikdy duplicitní záznamy nevzniknou a DISTINCT tedy zahodit.
Čistě teoreticky by mohla databáze z použití DISTINCT odvodit lepší prováděcí plán dotazu, protože vykoukat z klauzule GROUP BY unikátnost nemusí být obecně jednoduché.

Rozdíl je i ve spolehlivosti dotazu. Když přidáš do výstupu jeden další sloupec a nezměníš nic jiného, výsledky dotazů se budou většinou lišit. Odpověz si na otázku, které chování je žádané: a) vrátí víc řádků, b) vrátí náhodného reprezentanta z nově přidaného, nebo selže (závisí na DB).
Co dělat v připadě, že dotaz již GROUP BY obsahuje? V takovém případě by ti nezbylo než dotaz obalit ještě jedním dotazem.

U DISTINCT říkáš, co chceš, u GROUP BY říkáš více, jak to chceš. Obě možnosti dají stejný výsledek. Koho by však napadlo, že když chceš každý záznam vrátit jen jednou, musíš databázi říct, ať vytvoří skupinky a pak ať vrátí jejich reprezentanta.

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: