Czy możliwe jest użycie GROUP BY
więcej niż jednej kolumny w SELECT
zapytaniu MySQL ? Na przykład:
GROUP BY fV.tier_id AND 'f.form_template_id'
Czy możliwe jest użycie GROUP BY
więcej niż jednej kolumny w SELECT
zapytaniu MySQL ? Na przykład:
GROUP BY fV.tier_id AND 'f.form_template_id'
Odpowiedzi:
GROUP BY col1, col2, col3
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.
GROUP BY
dotyczy col1+col2
. np. col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
bieganie GROUP BY col1,col2
powróci 1,1|1,3|2,2
w przeciwieństwie do 1,1|2,2
sugerowanej. Natomiast GROUP 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 dla 2,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 kolumny
SUM
używania z GROUP BY
. Jeśli GROUP BY
tylko jedna kolumna, to SUM
wszystkie wartości każdej odrębnej (innej) wartości kolumny sqlfiddle.com/#!9/1cbde2/2 . Jeśli GROUP 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 mysql SUM
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.
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;
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
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.
GROUP BY CONCAT(col1, '_', col2)
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 ;