sql >> Databáze >  >> RDS >> Mysql

Jak GROUP BY DESC vybírá své pořadí?

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 v SELECT 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).



  1. Připojení Linuxu a UNIXu k Azure SQL Data Warehouse

  2. Příklady RAND() v SQL Server

  3. Použití DATE_ADD s názvem sloupce jako hodnota intervalu

  4. PHP/MySQL Vložit hodnoty null