Commento lungo qui;
Sì, non puoi farlo. Pensaci... Se hai un tavolo così:
Col1 Col2 Col3
A A 1
B A 2
C A 3
E stai raggruppando solo per Col2
, che raggrupperà in una singola riga... cosa succede a Col1
e Col3
? Entrambi hanno 3 valori di riga distinti. Come dovrebbe visualizzarli il tuo DBMS?
Col1 Col2 Col3
A? A 1?
B? 2?
C? 3?
Questo è il motivo per cui devi raggruppare per tutte le colonne, o altrimenti aggregarle o concatenarle. (SUM()
,MAX()
, MIN()
, ecc.)
Mostraci come vuoi che appaiano i risultati e sono sicuro che possiamo aiutarti.
Modifica - Risposta:
Prima di tutto, grazie per aver aggiornato la tua domanda. La tua query non ha id
ma i risultati attesi sì, quindi risponderò per ciascuno separatamente.
Senza id
Dovrai comunque raggruppare per tutte le colonne per ottenere ciò che stai cercando. Esaminiamolo.
Se esegui la tua query senza alcun gruppo per:
select col1, col2, col3 from table where col3='200'
Riceverai questo indietro:
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 |
| 5 | some text 1 | 200 |
| 1 | some text 1 | 200 |
+----------+-------------+-------+
Quindi ora vuoi vedere solo il col1 = 1
fila una volta. Ma per farlo, devi tirare tutti delle colonne in alto, quindi il tuo DBMS sa cosa fare con ciascuno di essi. Se provi a raggruppare solo per col1
, il tuo DBMS verificherà un errore perché non gli hai detto cosa fare con i dati extra in col2
e col3
:
select col1, col2, col3 from table where col3='200' group by col1 --Errors
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 |
| 5 | some text 1 | 200 |
| ? | some text 1?| 200? |
+----------+-------------+-------+
Se raggruppi per tutti e 3, il tuo DBMS sa di raggruppare insieme le intere righe (che è quello che vuoi) e visualizzerà le righe duplicate solo una volta:
select col1, col2, col3 from table where col3='200' group by col1, col2, col3
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 | --Desired results
| 5 | some text 1 | 200 |
+----------+-------------+-------+
Con id
Se vuoi vedere id
, dovrai comunicare al tuo DBMS quale id
da visualizzare. Anche se raggruppiamo per tutte le colonne, non otterrai i risultati desiderati, perché id
colonna renderà ogni riga distinta (non si raggrupperanno più insieme):
select id, col1, col2, col3 from table where col3='200' group by id, col1, col2, col3
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 | --id = 2
| 3 | 2 | some text 1 | 200 |
| 7 | 5 | some text 1 | 200 |
| 8 | 1 | some text 1 | 200 | --id = 8
+--------+----------+-------------+-------+
Quindi, per raggruppare queste righe, dobbiamo dire esplicitamente cosa fare con id
S. In base ai risultati desiderati, scegli id = 2
, che è il minimo id
, quindi usiamo MIN()
:
select MIN(id), col1, col2, col3 from table where col3='200' group by col1, col2, col3
--Note, MIN() is an aggregate function, so id need not be in the group by
Che restituisce i risultati desiderati (con id
):
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 3 | 2 | some text 1 | 200 |
| 7 | 5 | some text 1 | 200 |
+--------+----------+-------------+-------+
Pensamento finale
Ecco le tue due righe problematiche:
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 8 | 1 | some text 1 | 200 |
+--------+----------+-------------+-------+
Ogni volta che li colpisci, pensa a cosa vuoi che faccia ogni colonna, una alla volta. Dovrai gestire tutto colonne ogni volta che esegui raggruppamenti o aggregati.
id
, vuoi solo vedereid = 2
, che è ilMIN()
co1
, vuoi solo vedere valori distinti, quindiGROUP BY
col2
, vuoi solo vedere valori distinti, quindiGROUP BY
col3
, vuoi solo vedere valori distinti, quindiGROUP BY