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
iSELECT
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).