sql >> Database >  >> RDS >> Mysql

Hoe selecteert GROUP BY DESC zijn bestelling?

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 de SELECT 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).



  1. Probleem met SQLiteOpenHelper op Android 2.X en 3.X

  2. ORA-01111 in MRP in fysieke standby-database

  3. SQLSTATE[42000]:Syntaxisfout of toegangsfout:1055 Expressie #3 van de SELECT-lijst staat niet in de GROUP BY-clausule en bevat niet-geaggregeerde

  4. Hoe beïnvloeden NULL-waarden de prestaties bij het doorzoeken van een database?