sql >> Database teknologi >  >> RDS >> Mysql

Hvordan vælger GROUP BY DESC sin ordre?

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):

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



  1. Advarsel#1264:fejl uden for rækkevidde i mysql

  2. Konverter et Unix-tidsstempel til en datoværdi i Oracle

  3. STRING_AGG() Funktion i PostgreSQL

  4. CriteriaQuery måned og år filter