SELECT * FROM my_table GROUP BY section_identifier
is een ongeldige SQL
vraag.
Hoe GROUP BY
werkt?
Laten we de bovenstaande vraag bekijken en zien hoe GROUP BY
werken. Eerst selecteert de database-engine alle rijen die overeenkomen met de WHERE
clausule. Er is geen WHERE
clausule in deze zoekopdracht; dit betekent dat alle rijen van de tabel worden gebruikt om de resultatenset te genereren.
Vervolgens worden de rijen gegroepeerd met behulp van de uitdrukkingen die zijn opgegeven in de GROUP BY
clausule:
+----+--------------------+----------------------+----------+
| 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 |
+----+--------------------+----------------------+----------+
Ik heb de groepen in de bovenstaande lijst gemarkeerd om alles duidelijk te maken.
Bij de volgende stap produceert de database-engine van elke groep een enkele rij . Maar hoe?
De SELECT
clausule van uw zoekopdracht is SELECT *
. *
staat voor de volledige lijst met tabelkolommen; in dit geval SELECT *
is een korte manier om te schrijven:
SELECT id, section_identifier, option_identifier, store_id
Laten we de waarden van kolom id
analyseren voor de eerste groep. Welke waarde moet de database-engine kiezen voor id
? 17
of 23
? Waarom 17
en waarom 23
?
Het heeft geen criteria die de voorkeur geven aan 17
meer dan 23
. Het kiest er gewoon een uit (waarschijnlijk 17
maar dit hangt af van veel interne factoren) en dat gaat.
Er is geen probleem om de waarde voor section_identifier
te bepalen . Het is de kolom die wordt gebruikt om GROUP BY
, alle waarden in een groep zijn gelijk.
Het keuzedilemma doet zich weer voor op de kolommen option_identifier
en store_id
.
Volgens de standaard SQL
uw query is niet geldig en kan niet worden uitgevoerd. Sommige database-engines voeren het echter uit zoals hierboven beschreven. De waarden voor uitdrukkingen die dat niet zijn (ten minste een van de onderstaande):
- gebruikt in de
GROUP BY
clausule; - gebruikt met
GROUP BY
geaggregeerde functies in deSELECT
clausule; - functioneel afhankelijk van kolommen die worden gebruikt in de
GROUP BY
clausule;
zijn onbepaald.
Sinds versie 5.7.5
, MySQL
implementeert detectie van functionele afhankelijkheid
en standaard verwerpt het een ongeldige GROUP BY
vraag zoals die van jou.
Hoe het te laten werken
Het is mij niet duidelijk hoe je het resultaat wilt krijgen. Hoe dan ook, als je wat rijen uit de tabel wilt halen, dan GROUP BY
is niet de juiste manier om het te doen. GROUP BY
niet selecteer rijen uit een tabel, het genereert nieuwe waarden met behulp van de waarden uit de tabel. Een rij gegenereerd door GROUP BY
, komen meestal niet overeen met een rij uit de brontabel.
U kunt een mogelijke oplossing voor uw probleem vinden in dit antwoord . U moet de query zelf schrijven nadat u het idee hebt gelezen en begrepen (en het is u heel duidelijk hoe de "winnaars"-rijen moeten worden geselecteerd).