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