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 BYdoložka; - používá se s
GROUP BYagregační funkce vSELECTdoložka; - funkčně závislé na sloupcích použitých v
GROUP BYdolož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).