SELECT * FROM my_table GROUP BY section_identifier
je neplatný SQL
dotaz.
Jak GROUP BY
funguje?
Podívejme se na výše uvedený dotaz a uvidíme, jak GROUP BY
funguje. Nejprve databázový stroj vybere všechny řádky, které odpovídají WHERE
doložka. Neexistuje žádné WHERE
klauzule v tomto dotazu; to znamená, že ke generování sady výsledků se použijí všechny řádky tabulky.
Poté seskupuje řádky pomocí výrazů specifikovaných v GROUP BY
klauzule:
+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier | store_id |
+----+--------------------+----------------------+----------+
| 17 | header | header_option_one | 1 |
| 23 | header | header_option_three | 0 |
+----+--------------------+----------------------+----------+
| 18 | footer | footer_option_one | 0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature | homepage_feature_one | 0 |
| 25 | homepage_feature | homepage_feature_one | 1 |
+----+--------------------+----------------------+----------+
Skupiny jsem označil ve výpisu výše, aby bylo vše jasné.
V dalším kroku z každé skupiny databázový stroj vytvoří jeden řádek . Ale jak?
SELECT
klauzule vašeho dotazu je SELECT *
. *
znamená úplný seznam sloupců tabulky; v tomto případě SELECT *
je krátký způsob psaní:
SELECT id, section_identifier, option_identifier, store_id
Pojďme analyzovat hodnoty sloupce id
pro první skupinu. Jakou hodnotu by měl databázový stroj zvolit pro id
? 17
nebo 23
? Proč 17
a proč 23
?
Nemá žádná kritéria pro upřednostnění 17
více než 23
. Prostě vybere jednu z nich (pravděpodobně 17
ale to závisí na mnoha vnitřních faktorech) a platí jeden.
Není problém určit hodnotu pro section_identifier
. Je to sloupec používaný k GROUP BY
, všechny jeho hodnoty ve skupině jsou stejné.
Dilema výběru nastává opět ve sloupcích option_identifier
a store_id
.
Podle standardního SQL
váš dotaz není platný a nelze jej provést. Některé databázové stroje jej však provozují tak, jak je popsáno výše. Hodnoty pro výrazy, které nejsou (alespoň jeden z níže):
- používá se v
GROUP BY
doložka; - používá se s
GROUP BY
agregační funkce vSELECT
doložka; - funkčně závislé na sloupcích použitých v
GROUP BY
doložka;
jsou neurčité.
Od verze 5.7.5
, MySQL
implementuje funkční detekci závislostí
a ve výchozím nastavení odmítá neplatný GROUP BY
dotaz jako ten váš.
Jak to udělat, aby to fungovalo
Není mi jasné, jak chcete získat sadu výsledků. Každopádně, pokud chcete získat nějaké řádky z tabulky, pak GROUP BY
není správný způsob, jak to udělat. GROUP BY
není vyberte řádky z tabulky, vygeneruje nové hodnoty pomocí hodnot z tabulky. Řádek vygenerovaný GROUP BY
, většinou neodpovídají žádnému řádku ze zdrojové tabulky.
Možné řešení vašeho problému najdete v této odpovědi . Až si přečtete a pochopíte myšlenku, budete muset napsat dotaz sami (a je vám velmi jasné, jak by měly být vybrány „vítězné“ řádky).