Długi komentarz tutaj;
Tak, nie możesz tego zrobić. Pomyśl o tym... Jeśli masz taki stół:
Col1 Col2 Col3
A A 1
B A 2
C A 3
A grupujesz tylko według Col2
, który zgrupuje się w jednym wierszu... co się stanie z Col1
i Col3
? Oba mają 3 różne wartości wierszy. Jak Twój DBMS ma je wyświetlać?
Col1 Col2 Col3
A? A 1?
B? 2?
C? 3?
Dlatego musisz grupować według wszystkich kolumn lub w inny sposób je agregować lub łączyć. (SUM()
,MAX()
, MIN()
itp.)
Pokaż nam, jak chcesz, aby wyglądały wyniki, a na pewno możemy Ci pomóc.
Edytuj – odpowiedź:
Po pierwsze, dziękuję za aktualizację pytania. Twoje zapytanie nie ma id
ale twoje oczekiwane wyniki tak, więc odpowiem za każdy z osobna.
Bez id
Nadal będziesz musiał grupować według wszystkich kolumn, aby osiągnąć to, do czego dążysz. Przejdźmy przez to.
Jeśli uruchomisz zapytanie bez żadnej grupy przez:
select col1, col2, col3 from table where col3='200'
Odzyskasz to:
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 |
| 5 | some text 1 | 200 |
| 1 | some text 1 | 200 |
+----------+-------------+-------+
Więc teraz chcesz zobaczyć tylko col1 = 1
wiersz raz. Ale żeby to zrobić, musisz rzucić wszystko kolumn w górę, aby DBMS wiedział, co zrobić z każdą z nich. Jeśli spróbujesz grupować tylko według col1
, DBMS napotka błąd, ponieważ nie powiedziałeś mu, co zrobić z dodatkowymi danymi w col2
i 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? |
+----------+-------------+-------+
Jeśli grupujesz wszystkie 3, Twój DBMS wie, że grupuje razem całe wiersze (co jest tym, czego chcesz) i wyświetla zduplikowane wiersze tylko raz:
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 |
+----------+-------------+-------+
Z id
Jeśli chcesz zobaczyć id
, będziesz musiał powiedzieć swojemu DBMS, który id
wystawić. Nawet jeśli pogrupujemy według wszystkich kolumn, nie uzyskasz pożądanych wyników, ponieważ id
kolumna sprawi, że każdy wiersz będzie inny (nie będą się już grupować):
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
+--------+----------+-------------+-------+
Aby więc pogrupować te wiersze, musimy wyraźnie powiedzieć, co zrobić z id
s. Na podstawie żądanych wyników chcesz wybrać id = 2
, czyli minimum id
, więc użyjmy 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
Który zwraca pożądane wyniki (z id
):
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 3 | 2 | some text 1 | 200 |
| 7 | 5 | some text 1 | 200 |
+--------+----------+-------------+-------+
Ostateczna myśl
Oto twoje dwa wiersze problemów:
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 8 | 1 | some text 1 | 200 |
+--------+----------+-------------+-------+
Za każdym razem, gdy je trafisz, pomyśl tylko, co chcesz zrobić w każdej kolumnie, pojedynczo. Będziesz musiał obsłużyć wszystko kolumny za każdym razem, gdy grupujesz lub agregujesz.
id
, chcesz zobaczyć tylkoid = 2
, czyliMIN()
co1
, chcesz widzieć tylko różne wartości, więcGROUP BY
col2
, chcesz widzieć tylko różne wartości, więcGROUP BY
col3
, chcesz widzieć tylko różne wartości, więcGROUP BY