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'
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'
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 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.
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
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 .
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 ;