Чи можна групувати за декількома стовпцями за допомогою MySQL?


206

Чи можливо для запиту GROUP BYMySQL більше одного стовпця SELECT? Наприклад:

GROUP BY fV.tier_id AND 'f.form_template_id'

3
Ви не можете групуватись за рядками. Хоча ви можете згрупувати за стовпцями
Джо Філіпс


1
Можливо, вам доведеться зробити підзапит замість використання декількох груп за допомогою пунктів.
Адам Ф

Хоча більшість відповідей з високим голосом фактично однакові між собою (вони показують правильний синтаксис і пояснюють ефект перемикання порядку двох стовпців), якщо ваша потреба дещо інша, розгляньте відповідь Даніклада .
ToolmakerSteve

Відповіді:



107

Так, ви можете згрупувати декілька стовпців. Наприклад,

SELECT * FROM table
GROUP BY col1, col2

Результати спочатку будуть згруповані по col1, потім по col2. У MySQL налаштування стовпців йде зліва направо.


5
Перевага зліва направо застосовується до порядку зростання угруповань, а не до налаштування групи стовпців. GROUP BYзастосовується col1+col2. наприклад, col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2і біг GROUP BY col1,col2повернеться 1,1|1,3|2,2на відміну від 1,1|2,2запропонованого. Тоді як GROUP BY col2, col1буде змінено порядок зростання, що повертається col2. 1,1|2,2|1,3 Демо: sqlfiddle.com/#!9/d5f69/1 Зверніть увагу, що ідентифікатор рядка: 2 повертається в обох випадках, 2,2незважаючи на інвертування стовпців.
fyrye

Ще одне тестування. sqlfiddle.com/#!9/5c8763/2 Висновок. Спочатку mysql сортує за першим визначеним стовпцем (з GROUP BY). І якщо в першому визначеному стовпці є рівні результати, то лише в межах рівних результатів сортує другий визначений стовпець
user2360831

Що стосується SUMвикористання с GROUP BY. Якщо GROUP BYтільки один стовпець, то SUMs всі значення кожного окремого (різного) значення стовпця sqlfiddle.com/#!9/1cbde2/2 . Якщо GROUP BYдва стовпці. Тоді mysql спочатку перевіряє, чи є значення першого стовпця для другого стовпця. Якщо так, то mysql SUMкожне інше значення другого стовпця sqlfiddle.com/#!9/1cbde2/1 .
користувач2360831

23

Так, але що означає групування за двома двома стовпцями? Ну, це те саме, що групувати по кожній унікальній парі в ряд. Порядок, який ви перераховуєте стовпцям, змінює спосіб сортування рядків.

У вашому прикладі ви б написали

GROUP BY fV.tier_id, f.form_template_id

Тим часом код

GROUP BY f.form_template_id, fV.tier_id

дав би подібні результати, але сортував по-різному.



13

Щоб використати простий приклад, у мене був лічильник, який потребував узагальнення унікальних IP-адрес на відвідуваній сторінці на сайті. Що в основному групується за назвою сторінки, а потім за IP-адресою. Я вирішив це за допомогою комбінації DISTINCT і GROUP BY.

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

2
Цю відповідь варто зазначити, оскільки вона вирішує дещо іншу проблему, ніж інші відповіді.
ToolmakerSteve

5

Якщо ви віддаєте перевагу (мені потрібно застосувати це) групу за двома стовпцями одночасно, я щойно побачив цей момент:

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

1
Дивіться коментарі ypercube під відповіддю lada. Розглянемо в якості альтернативи: SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Зазвичай результати будуть виглядати так само, як і ця відповідь, але внутрішнє виконання є зовсім іншим.
ToolmakerSteve

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

37
Цікаво, як відповідь із лише одним рядком коду, розміщеним через 4 роки після відповіді на запитання, отримує 8 (вісім!) Відгуків. Окрім того, що є невірним та неефективним, окрім пізнього та короткого.
ypercubeᵀᴹ

8
@ ypercubeᵀᴹ, чому ти кажеш, що це неправильно? Це саме те, що я шукав, і правильне тлумачення "групи за кількома колонками". Насправді я не знаю, чому це не поведінка "групи за col1, col2", як я очікував
Авраам

3
@Abram надсилає вас, тому ви бачите мою відповідь на NeverEndingQueue. Недоліки: це менше - набагато менше - ефективніше , ніж GROUP BY col1, col2. Це дасть неправильні результати з деякими даними. Скажіть, col1, col2мають значення: ('a_b', 'c')в одному ряду та ('a', 'b_c')в іншому. Ця неправильна відповідь із GROUP BY CONCAT об'єднає два ряди в один. Правильної відповіді не буде.
ypercubeᵀᴹ

1
Ніхто не перешкоджає вам використовувати вираз CONCAT у списку SELECT, якщо вам це потрібно:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ

1
@ ypercubeᵀᴹ ой, нерозумно я думав, що "група за дурнями, бар" поводився як "... група за спілками ... група за баром". Це було б справді незвичним випадком для GROUP BY CONCAT.
Аврам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.