Czy można grupować według wielu kolumn za pomocą MySQL?


206

Czy możliwe jest użycie GROUP BYwięcej niż jednej kolumny w SELECTzapytaniu MySQL ? Na przykład:

GROUP BY fV.tier_id AND 'f.form_template_id'

3
Nie można grupować według wierszy. Możesz jednak grupować według kolumn
Joe Phillips


1
Może być konieczne wykonanie podzapytania zamiast używania wielu grup według klauzul.
Adam F

Chociaż większość wysoko głosowanych odpowiedzi jest zasadniczo taka sama (pokazują prawidłową składnię i wyjaśniają efekt zmiany kolejności dwóch kolumn), jeśli twoja potrzeba jest nieco inna, rozważ odpowiedź Daniklada .
ToolmakerSteve

Odpowiedzi:



107

Tak, możesz pogrupować według wielu kolumn. Na przykład,

SELECT * FROM table
GROUP BY col1, col2

Wyniki zostaną najpierw pogrupowane według kolumny 1, a następnie kolumny 2. W MySQL preferencje kolumn są zmieniane od lewej do prawej.


5
Preferencje od lewej do prawej są stosowane w porządku rosnącym grupowania, a nie w preferencjach grup kolumn. GROUP BYdotyczy col1+col2. np. col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2bieganie GROUP BY col1,col2powróci 1,1|1,3|2,2w przeciwieństwie do 1,1|2,2sugerowanej. Natomiast GROUP BY col2, col1zmieniłby rosnącą kolejność zwracania col2. 1,1|2,2|1,3 Demo: sqlfiddle.com/#!9/d5f69/1 Zwróć uwagę, że identyfikator wiersza: 2 jest zwracany w obu przypadkach dla 2,2pomimo odwrócenia kolumn.
fyrye

Jeszcze jedno testowanie. sqlfiddle.com/#!9/5c8763/2 Wniosek. Na początku mysql sortuje według pierwszej zdefiniowanej kolumny (z GROUP BY). A jeśli w pierwszej zdefiniowanej kolumnie są takie same wyniki, to tylko w obrębie równych wyników sortuje się według drugiej zdefiniowanej kolumny
user2360831

Odnośnie SUMużywania z GROUP BY. Jeśli GROUP BYtylko jedna kolumna, to SUMwszystkie wartości każdej odrębnej (innej) wartości kolumny sqlfiddle.com/#!9/1cbde2/2 . Jeśli GROUP BYdwie kolumny. Następnie mysql na początku sprawdza, czy dla wartości pierwszej kolumny istnieją inne wartości w drugiej kolumnie. Jeśli tak, to mysql SUMkażdą inną wartość drugiej kolumny sqlfiddle.com/#!9/1cbde2/1 .
user2360831,

23

Tak, ale co oznacza grupowanie według dwóch kolejnych kolumn? Cóż, jest to to samo, co grupowanie według każdej unikalnej pary w rzędzie. Kolejność wyświetlania kolumn zmienia sposób sortowania wierszy.

W swoim przykładzie piszesz

GROUP BY fV.tier_id, f.form_template_id

Tymczasem kod

GROUP BY f.form_template_id, fV.tier_id

dałoby podobne wyniki, ale posortowane inaczej.



13

Aby użyć prostego przykładu, miałem licznik, który musiał podsumować unikalne adresy IP na odwiedzoną stronę w witrynie. To jest w zasadzie grupowanie według nazwy strony, a następnie według adresu IP. Rozwiązałem to dzięki kombinacji DISTINCT i GROUP BY.

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;

2
Ta odpowiedź jest warta odnotowania, ponieważ rozwiązuje nieco inny problem niż inne odpowiedzi.
ToolmakerSteve

5

Jeśli wolisz (muszę to zastosować) grupować według dwóch kolumn jednocześnie, właśnie zobaczyłem ten punkt:

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1

1
Zobacz komentarze ypercube pod odpowiedzią Łady. Rozważyć jako alternatywę: SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Wyniki zwykle będą wyglądały tak samo jak ta odpowiedź, ale wewnętrzne wykonanie jest zupełnie inne.
ToolmakerSteve

-2
GROUP BY CONCAT(col1, '_', col2)

37
Zastanawiam się, jak odpowiedź z jednym wierszem kodu, opublikowana 4 lata po odpowiedzi na pytanie, otrzymuje 8 (osiem!) Głosów pozytywnych. Chociaż jest również niepoprawny i nieefektywny, poza późnym i krótkim.
ypercubeᵀᴹ

8
@ ypercubeᵀᴹ dlaczego uważasz, że jest niepoprawny? Właśnie tego szukałem i poprawnej interpretacji „grupuj według wielu kolumn”. W rzeczywistości nie wiem, dlaczego nie jest to zachowanie „grupuj według kolumn 1, 2”, jak się spodziewałam
Abram

3
@Abram pinguje cię, więc zobaczysz moją odpowiedź na NeverEndingQueue. Wady: jest mniej - znacznie mniej - wydajny niż GROUP BY col1, col2. Przy niektórych danych da złe wyniki. Powiedzmy, col1, col2że mają wartości: ('a_b', 'c')w jednym rzędzie iw ('a', 'b_c')drugim. Ta błędna odpowiedź w przypadku GROUP BY CONCAT połączy dwa wiersze w jednym. Prawidłowa odpowiedź nie.
ypercubeᵀᴹ

1
SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
Nawiasem

1
@ ypercubeᵀᴹ ups, głupio myślałem „grupa po foo, bar” zachowywał się jak „… grupa po unii foo… grupa po bar”. Byłby to niezwykły przypadek dla GROUP BY CONCAT.
Abram
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.