Lange reactie hier;
Ja, dat kan je niet doen. Denk er eens over na... Als je zo'n tafel hebt:
Col1 Col2 Col3
A A 1
B A 2
C A 3
En je groepeert alleen op Col2
, die wordt gegroepeerd tot een enkele rij... wat gebeurt er met Col1
en Col3
? Beide hebben 3 verschillende rijwaarden. Hoe moet uw DBMS deze weergeven?
Col1 Col2 Col3
A? A 1?
B? 2?
C? 3?
Daarom moet u op alle kolommen groeperen, of ze op een andere manier aggregeren of samenvoegen. (SUM()
,MAX()
, MIN()
, enz..)
Laat ons zien hoe u wilt dat de resultaten eruitzien en ik weet zeker dat we u kunnen helpen.
Bewerken - Antwoord:
Allereerst bedankt voor het updaten van je vraag. Uw zoekopdracht heeft geen id
maar uw verwachte resultaten doen dat, dus ik zal voor elk afzonderlijk antwoorden.
Zonder id
U moet nog steeds op alle kolommen groeperen om te bereiken waar u voor gaat. Laten we er doorheen lopen.
Als u uw zoekopdracht zonder enige groep uitvoert op:
select col1, col2, col3 from table where col3='200'
Je krijgt dit terug:
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 |
| 5 | some text 1 | 200 |
| 1 | some text 1 | 200 |
+----------+-------------+-------+
Dus nu wil je alleen de col1 = 1
. zien rij eens. Maar om dit te doen, moet je alles . gooien van de kolommen omhoog, zodat uw DBMS weet wat ze met elk ervan moeten doen. Als u probeert te groeperen op alleen col1
, zal je DBMS door een fout gaan omdat je het niet hebt verteld wat het moet doen met de extra gegevens in col2
en 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? |
+----------+-------------+-------+
Als u groepeert op alle 3, weet uw DBMS de volledige rijen te groeperen (wat u wilt), en zal het dubbele rijen slechts één keer weergeven:
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 |
+----------+-------------+-------+
Met id
Als je id
. wilt zien , moet u uw DBMS vertellen welke id
weergeven. Zelfs als we groeperen op alle kolommen, krijgt u niet de gewenste resultaten, omdat de id
kolom zal elke rij onderscheiden (ze zullen niet langer bij elkaar worden gegroepeerd):
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
+--------+----------+-------------+-------+
Dus om deze rijen te groeperen, moeten we expliciet zeggen wat we moeten doen met de id
s. Op basis van uw gewenste resultaten, wilt u id = 2
. kiezen , wat het minimum . is id
, dus laten we MIN()
. gebruiken :
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
Wat de gewenste resultaten oplevert (met id
):
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 3 | 2 | some text 1 | 200 |
| 7 | 5 | some text 1 | 200 |
+--------+----------+-------------+-------+
Laatste gedachte
Dit waren je twee probleemrijen:
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 8 | 1 | some text 1 | 200 |
+--------+----------+-------------+-------+
Telkens wanneer u deze raakt, bedenk dan wat u wilt dat elke kolom één voor één doet. U moet alles afhandelen kolommen elke keer dat u groepeert of aggregeert.
id
, je wilt alleenid = 2
. zien , wat deMIN()
. isco1
, je wilt alleen afzonderlijke waarden zien, dusGROUP BY
col2
, je wilt alleen afzonderlijke waarden zien, dusGROUP BY
col3
, je wilt alleen afzonderlijke waarden zien, dusGROUP BY