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'
Myśl Rhysa
źródło
3
Nie można grupować według wierszy. Możesz jednak grupować według kolumn
Joe Phillips
Jaka jest ta wersja składniowa: stackoverflow.com/questions/2421388/...
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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:

292
GROUP BY col1, col2, col3
Joe Phillips
źródło
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.

php
źródło
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.

brandonCabi
źródło
17
group by fV.tier_id, f.form_template_id
Trevor
źródło
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;
Daniklad
źródło
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
Lucas Andrade
źródło
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)
lada
źródło
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