Lång kommentar här;
Ja, det kan du inte göra. Tänk på det... Om du har ett sådant bord:
Col1 Col2 Col3
A A 1
B A 2
C A 3
Och du grupperar endast efter Col2
, som kommer att gruppera ner till en enda rad... vad händer med Col1
och Col3
? Båda dessa har tre distinkta radvärden. Hur ska ditt DBMS visa dessa?
Col1 Col2 Col3
A? A 1?
B? 2?
C? 3?
Det är därför du måste gruppera efter alla kolumner, eller på annat sätt aggregera eller sammanfoga dem. (SUM()
,MAX()
, MIN()
, etc..)
Visa oss hur du vill att resultaten ska se ut och jag är säker på att vi kan hjälpa dig.
Redigera - Svar:
Först och främst, tack för att du uppdaterade din fråga. Din fråga har inte id
men dina förväntade resultat gör det, så jag kommer att svara för varje separat.
Utan id
Du måste fortfarande gruppera efter alla kolumner för att uppnå det du vill. Låt oss gå igenom det.
Om du kör din fråga utan någon grupp av:
select col1, col2, col3 from table where col3='200'
Du får detta tillbaka:
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 |
| 5 | some text 1 | 200 |
| 1 | some text 1 | 200 |
+----------+-------------+-------+
Så nu vill du bara se col1 = 1
rad en gång. Men för att göra det måste du rulla alla av kolumnerna upp, så att din DBMS vet vad du ska göra med var och en av dem. Om du försöker gruppera efter endast col1
, kommer din DBMS att gå igenom ett fel eftersom du inte berättade vad den ska göra med extra data i col2
och 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? |
+----------+-------------+-------+
Om du grupperar efter alla 3, vet din DBMS att gruppera hela raderna (vilket är vad du vill), och kommer bara att visa dubbletter av rader en gång:
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 |
+----------+-------------+-------+
Med id
Om du vill se id
, måste du tala om för ditt DBMS vilket id
att visa. Även om vi grupperar efter alla kolumner får du inte önskat resultat, eftersom id
kolumnen kommer att göra varje rad distinkt (De kommer inte längre att grupperas):
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
+--------+----------+-------------+-------+
Så för att gruppera dessa rader måste vi uttryckligen säga vad vi ska göra med id
s. Baserat på dina önskade resultat vill du välja id = 2
, vilket är minsta id
, så låt oss använda 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
Vilket returnerar dina önskade resultat (med id
):
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 3 | 2 | some text 1 | 200 |
| 7 | 5 | some text 1 | 200 |
+--------+----------+-------------+-------+
Avslutande tanke
Här var dina två problemrader:
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 8 | 1 | some text 1 | 200 |
+--------+----------+-------------+-------+
Varje gång du träffar dessa, tänk bara på vad du vill att varje kolumn ska göra, en i taget. Du måste hantera alla kolumner varje gång du grupperar eller sammanställer.
id
, vill du bara seid = 2
, vilket ärMIN()
co1
, vill du bara se distinkta värden, såGROUP BY
col2
, vill du bara se distinkta värden, såGROUP BY
col3
, vill du bara se distinkta värden, såGROUP BY