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 BYclausule; - gebruikt met
GROUP BYgeaggregeerde functies in deSELECTclausule; - functioneel afhankelijk van kolommen die worden gebruikt in de
GROUP BYclausule;
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).