sql >> Databasteknik >  >> RDS >> Mysql

Hur väljer GROUP BY DESC sin beställning?

SELECT * FROM my_table GROUP BY section_identifier

är en ogiltig SQL fråga.

Hur GROUPERA EFTER fungerar?

Låt oss få frågan ovan och se hur GROUPERA EFTER Arbetar. Först väljer databasmotorn alla rader som matchar WHERE klausul. Det finns ingen WHERE klausul i denna fråga; detta betyder att alla rader i tabellen används för att generera resultatuppsättningen.

Den grupperar sedan raderna med de uttryck som anges i GROUP BY klausul:

+----+--------------------+----------------------+----------+
| 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 |
+----+--------------------+----------------------+----------+

Jag markerade grupperna i listan ovan för att göra allt tydligt.

I nästa steg, från varje grupp producerar databasmotorn en enda rad . Men hur?

SELECT satsen i din fråga är SELECT * . * står för hela listan över tabellkolumner; i det här fallet, SELECT * är ett kort sätt att skriva:

SELECT id, section_identifier, option_identifier, store_id

Låt oss analysera värdena för kolumnen id för den första gruppen. Vilket värde ska databasmotorn välja för id ? 17 eller 23 ? Varför 17 och varför 23 ?

Den har inga kriterier för att favorisera 17 över 23 . Den väljer bara en av dem (förmodligen 17 men detta beror på många interna faktorer) och går en.

Det är inga problem att fastställa värdet för sektionsidentifierare . Det är kolumnen som används för att GROUPA EFTER , alla dess värden i en grupp är lika.

Valdilemmat uppstår igen i kolumnerna option_identifier och butiks-id .

Enligt standarden SQL din fråga är inte giltig och kan inte köras. Men vissa databasmotorer kör det enligt beskrivningen ovan. Värdena för uttryck som inte är det (minst ett av nedan):

  • används i GROUP BY klausul;
  • används med GROUP BY samla funktioner i SELECT klausul;
  • funktionellt beroende av kolumner som används i GROUP BY klausul;

är obestämda.

Sedan version 5.7.5 , MySQL implementerar detektering av funktionellt beroende och som standard avvisar den en ogiltig GROUP BY fråga som din.

Hur man får det att fungera

Det är inte klart för mig hur du vill få resultatet. Hur som helst, om du vill få några rader från tabellen så GROUP BY är inte det korrekta sättet att göra det. GRUPPER EFTER inte välj rader från en tabell, den genererar nya värden med hjälp av värdena från tabellen. En rad genererad av GROUP BY , de flesta gångerna, matchar inte någon rad från källtabellen.

Du kan hitta en möjlig lösning på ditt problem i det här svaret . Du måste skriva frågan själv efter att du läst och förstått idén (och det är mycket tydligt för dig hur "vinnarraderna" ska väljas).



  1. dplyr left_join med mindre än, större än condition

  2. Hur man använder kommandot Compact and Repair i Access

  3. Föredragen metod för att lagra lösenord i databasen

  4. En modell för livsmedelsleveransdata