Можно ли сгруппировать несколько столбцов, используя MySQL?


206

Возможно ли GROUP BYболее одного столбца в SELECTзапросе MySQL ? Например:

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несмотря на инвертирование столбцов.
фырье

Еще одно тестирование. sqlfiddle.com/#!9/5c8763/2 Заключение. Сначала mysql сортирует по первому определенному столбцу (с GROUP BY). И если в первом определенном столбце есть равные результаты, то только в пределах одинаковых результатов сортируется по второму определенному столбцу
user2360831

Что касается SUMиспользования с GROUP BY. Если GROUP BYтолько по одному столбцу, то SUMвсе значения каждого отдельного (различного) значения столбца sqlfiddle.com/#!9/1cbde2/2 . Если GROUP BYдва столбца. Затем mysql сначала проверяет, есть ли для первого значения столбца разные значения во втором столбце. Если да, то mysql SUMкаждое другое значение второго столбца sqlfiddle.com/#!9/1cbde2/1 .
user2360831

23

Да, но что означает группировка по двум столбцам? Ну, это то же самое, что группировка по каждой уникальной паре в ряду. Порядок перечисления столбцов изменяет способ сортировки строк.

В вашем примере вы бы написали

GROUP BY fV.tier_id, f.form_template_id

Между тем код

GROUP BY f.form_template_id, fV.tier_id

даст аналогичные результаты, но отсортированы по-разному.



13

Чтобы использовать простой пример, у меня был счетчик, который должен был суммировать уникальные IP-адреса для каждой посещенной страницы на сайте. Который в основном группируется по pagename, а затем по 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 под ответом Лады. Рассмотрим в качестве альтернативы SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Результаты обычно выглядят так же, как этот ответ, но внутреннее исполнение совсем другое.
ToolmakerSteve

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

37
Интересно, как ответ с одной строкой кода, опубликованный через 4 года после ответа на вопрос, получает 8 (восемь!) Голосов. Хотя также является неправильным и неэффективным, кроме поздних и коротких.
ypercubeᵀᴹ

8
@ ypercubeᵀᴹ почему ты говоришь, что это неправильно? Это именно то, что я искал, и правильная интерпретация «группа по нескольким столбцам». На самом деле, я не знаю, почему это не поведение «group by col1, col2», как я ожидал
Абрам

3
@ Абрам пингует тебя, так что ты видишь мой ответ на 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ᵀᴹ ой, глупо я думал, что "группа по foo, bar" вела себя как "... группа по foo union ... group by bar". Это был бы действительно необычный случай для GROUP BY CONCAT.
Абрам
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.