VÆLG * FRA min_tabel GROUP BY section_identifier
er en ugyldig SQL
forespørgsel.
Hvordan GRUPPER EFTER
virker?
Lad os få forespørgslen ovenfor og se hvordan GRUPPER EFTER
arbejder. Først vælger databasemotoren alle de rækker, der matcher WHERE
klausul. Der er ingen WHERE
klausul i denne forespørgsel; det betyder, at alle rækkerne i tabellen bruges til at generere resultatsættet.
Den grupperer derefter rækkerne ved hjælp af de udtryk, der er angivet i GROUP BY
klausul:
+----+---------------------+---------------- -----+----------+| id | sektionsidentifikator | option_id | butiks-id |+----+---------------------+-------------------- --+----------+| 17 | overskrift | header_option_one | 1 || 23 | overskrift | header_option_three | 0 |+----+---------------------+------------------------ --+----------+| 18 | sidefod | footer_option_one | 0 |+----+---------------------+------------------------ --+----------+| 19 | homepage_feature | homepage_feature_one | 0 || 25 | homepage_feature | homepage_feature_one | 1 |+----+---------------------+------------------------ -+----------+
Jeg markerede grupperne i listen ovenfor for at gøre alt klart.
På det næste trin, fra hver gruppe producerer databasemotoren en enkelt række . Men hvordan?
SELECT
klausulen i din forespørgsel er SELECT *
. *
står for den fulde liste over tabelkolonner; i dette tilfælde SELECT *
er en kort måde at skrive på:
SELECT id, section_identifier, option_identifier, store_id
Lad os analysere værdierne for kolonne id
for den første gruppe. Hvilken værdi skal databasemotoren vælge for id
? 17
eller 23
? Hvorfor 17
og hvorfor 23
?
Den har ingen kriterier for at favorisere 17
over 23
. Den vælger bare en af dem (sandsynligvis 17
men dette afhænger af en masse interne faktorer) og går en.
Der er ikke noget problem at bestemme værdien for section_identifier
. Det er den kolonne, der bruges til at GRUPPER EFTER
, alle dens værdier i en gruppe er ens.
Valgdilemmaet opstår igen i kolonnerne option_identifier
og butiks-id
.
I henhold til standarden SQL
din forespørgsel er ikke gyldig, og den kan ikke udføres. Men nogle databasemotorer kører det som beskrevet ovenfor. Værdierne for udtryk, der ikke er (mindst én af nedenstående):
- bruges i
GROUP BY
klausul; - bruges med
GRUPPER EFTER aggregerede funktioner
iSELECT
klausul; - funktionelt afhængig af kolonner brugt i
GROUP BY
klausul;
er ubestemmelige.
Siden version 5.7.5
, MySQL
implementerer detektion af funktionel afhængighed
og som standard afviser den en ugyldig GROUP BY
forespørgsel som din.
Sådan får du det til at fungere
Det er ikke klart for mig, hvordan du ønsker at få resultatet sat. I hvert fald, hvis du ønsker at få nogle rækker fra tabellen, så GROUP BY
er ikke den rigtige måde at gøre det på. GRUPPER EFTER
ikke vælge rækker fra en tabel, genererer den nye værdier ved hjælp af værdierne fra tabellen. En række genereret af GROUP BY
, de fleste af gange, matcher ikke nogen række fra kildetabellen.
Du kan finde en mulig løsning på dit problem i dette svar . Du skal selv skrive forespørgslen, efter du har læst og forstået idéen (og det er meget klart for dig, hvordan "vinder"-rækkerne skal udvælges).