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

206

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

GROUP BY fV.tier_id AND 'f.form_template_id'
Мысль Риса
источник
3
Вы не можете группировать по строкам. Вы можете группировать по столбцам, хотя
Джо Филлипс
Что это за синтаксическая версия: stackoverflow.com/questions/2421388/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
Вам может потребоваться выполнить подзапрос вместо использования нескольких групповых предложений.
Адам Ф.
Хотя большинство ответов с высоким рейтингом по существу совпадают друг с другом (они показывают правильный синтаксис и объясняют эффект переключения порядка двух столбцов), если ваша потребность несколько отличается, рассмотрите ответ Даниклада .
ToolmakerSteve

Ответы:

107

Да, вы можете группировать по нескольким столбцам. Например,

SELECT * FROM table
GROUP BY col1, col2

Результаты сначала будут сгруппированы по col1, а затем по col2. В MySQL предпочтение столбца идет слева направо.

PHP
источник
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

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

brandonCabi
источник
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;
Daniklad
источник
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.
Абрам