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

In che modo GROUP BY DESC seleziona il suo ordine?

SELECT * FROM my_table GROUP BY section_identifier

è un SQL non valido interrogazione.

Come GROUP BY funziona?

Prendiamo la query sopra e vediamo come GROUP BY lavori. Per prima cosa il motore di database seleziona tutte le righe che corrispondono a WHERE clausola. Non c'è WHERE clausola in questa query; questo significa che tutte le righe della tabella vengono utilizzate per generare il set di risultati.

Raggruppa quindi le righe utilizzando le espressioni specificate in GROUP BY clausola:

+----+--------------------+----------------------+----------+
| 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 |
+----+--------------------+----------------------+----------+

Ho contrassegnato i gruppi nell'elenco sopra per chiarire tutto.

Nella fase successiva, da ogni gruppo il motore di database produce una singola riga . Ma come?

Il SELECT la clausola della tua query è SELECT * . * sta per l'elenco completo delle colonne della tabella; in questo caso, SELECT * è un modo breve per scrivere:

SELECT id, section_identifier, option_identifier, store_id

Analizziamo i valori della colonna id per il primo gruppo. Quale valore dovrebbe scegliere il motore di database per id ? 17 o 23 ? Perché 17 e perché 23 ?

Non ha alcun criterio per favorire 17 su 23 . Ne sceglie solo uno (probabilmente 17 ma questo dipende da molti fattori interni) e ne vale uno.

Non ci sono problemi nel determinare il valore per section_identifier . È la colonna utilizzata per GROUP BY , tutti i suoi valori in un gruppo sono uguali.

Il dilemma della scelta si ripresenta sulle colonne option_identifier e store_id .

Secondo lo standard SQL la tua richiesta non è valida e non può essere eseguita. Tuttavia, alcuni motori di database lo eseguono come descritto sopra. I valori per le espressioni che non lo sono (almeno una delle seguenti):

  • usato nel GROUP BY clausola;
  • usato con GROUP BY funzioni aggregate nel SELECT clausola;
  • funzionalmente dipendente dalle colonne utilizzate in GROUP BY clausola;

sono indeterminati.

Dalla versione 5.7.5 , MySQL implementa il rilevamento delle dipendenze funzionali e, per impostazione predefinita, rifiuta un GROUP BY non valido query come la tua.

Come farlo funzionare

Non è chiaro per me come vuoi ottenere il set di risultati. Ad ogni modo, se vuoi ottenere alcune righe dalla tabella, allora GROUP BY non lo è il modo corretto per farlo. GROUP BY non seleziona le righe da una tabella, genera nuovi valori utilizzando i valori della tabella. Una riga generata da GROUP BY , il più delle volte, non corrispondono a nessuna riga della tabella di origine.

Puoi trovare una possibile soluzione al tuo problema in questa risposta . Dovrai scrivere tu stesso la query dopo aver letto e compreso l'idea (ed è molto chiaro per te come selezionare le righe "vincitore").