Вам может потребоваться выполнить подзапрос вместо использования нескольких групповых предложений.
Адам Ф.
Хотя большинство ответов с высоким рейтингом по существу совпадают друг с другом (они показывают правильный синтаксис и объясняют эффект переключения порядка двух столбцов), если ваша потребность несколько отличается, рассмотрите ответ Даниклада .
Предпочтение слева направо применяется к возрастающему порядку групп, а не к предпочтению группы столбцов. 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
даст аналогичные результаты, но отсортированы по-разному.
Чтобы использовать простой пример, у меня был счетчик, который должен был суммировать уникальные IP-адреса для каждой посещенной страницы на сайте. Который в основном группируется по pagename, а затем по IP. Я решил это с помощью комбинации DISTINCT и GROUP BY.
Смотрите комментарии ypercube под ответом Лады. Рассмотрим в качестве альтернативы SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Результаты обычно выглядят так же, как этот ответ, но внутреннее исполнение совсем другое.
Интересно, как ответ с одной строкой кода, опубликованный через 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.
Ответы:
источник
Да, вы можете группировать по нескольким столбцам. Например,
Результаты сначала будут сгруппированы по col1, а затем по col2. В MySQL предпочтение столбца идет слева направо.
источник
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
несмотря на инвертирование столбцов.GROUP BY
). И если в первом определенном столбце есть равные результаты, то только в пределах одинаковых результатов сортируется по второму определенному столбцуSUM
использования сGROUP BY
. ЕслиGROUP BY
только по одному столбцу, тоSUM
все значения каждого отдельного (различного) значения столбца sqlfiddle.com/#!9/1cbde2/2 . ЕслиGROUP BY
два столбца. Затем mysql сначала проверяет, есть ли для первого значения столбца разные значения во втором столбце. Если да, то mysqlSUM
каждое другое значение второго столбца sqlfiddle.com/#!9/1cbde2/1 .Да, но что означает группировка по двум столбцам? Ну, это то же самое, что группировка по каждой уникальной паре в ряду. Порядок перечисления столбцов изменяет способ сортировки строк.
В вашем примере вы бы написали
GROUP BY fV.tier_id, f.form_template_id
Между тем код
GROUP BY f.form_template_id, fV.tier_id
даст аналогичные результаты, но отсортированы по-разному.
источник
источник
Чтобы использовать простой пример, у меня был счетчик, который должен был суммировать уникальные IP-адреса для каждой посещенной страницы на сайте. Который в основном группируется по pagename, а затем по IP. Я решил это с помощью комбинации DISTINCT и GROUP BY.
источник
Если вы предпочитаете (мне нужно применить это) группу по двум столбцам одновременно, я только что увидел этот момент:
источник
SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2
. Результаты обычно выглядят так же, как этот ответ, но внутреннее исполнение совсем другое.источник
GROUP BY col1, col2
. Это даст неправильные результаты с некоторыми данными. Скажем,col1, col2
есть значения:('a_b', 'c')
в одном ряду и('a', 'b_c')
в другом. Это неправильный ответ, когда GROUP BY CONCAT объединит две строки в одну. Правильного ответа не будет.SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;