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 .
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.
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.
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.
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.
Odpowiedzi:
źródło
Tak, możesz pogrupować według wielu kolumn. Na przykład,
Wyniki zostaną najpierw pogrupowane według kolumny 1, a następnie kolumny 2. W MySQL preferencje kolumn są zmieniane od lewej do prawej.
źródło
GROUP BY
dotyczycol1+col2
. np.col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
bieganieGROUP BY col1,col2
powróci1,1|1,3|2,2
w przeciwieństwie do1,1|2,2
sugerowanej. NatomiastGROUP BY col2, col1
zmienił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 dla2,2
pomimo odwrócenia kolumn.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 kolumnySUM
używania zGROUP BY
. JeśliGROUP BY
tylko jedna kolumna, toSUM
wszystkie wartości każdej odrębnej (innej) wartości kolumny sqlfiddle.com/#!9/1cbde2/2 . JeśliGROUP BY
dwie 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 mysqlSUM
każdą inną wartość drugiej kolumny sqlfiddle.com/#!9/1cbde2/1 .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.
źródło
źródło
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.
źródło
Jeśli wolisz (muszę to zastosować) grupować według dwóch kolumn jednocześnie, właśnie zobaczyłem ten punkt:
źródło
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.źródło
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.SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;