Возможно ли GROUP BY
более одного столбца в SELECT
запросе MySQL ? Например:
GROUP BY fV.tier_id AND 'f.form_template_id'
Возможно ли GROUP BY
более одного столбца в SELECT
запросе MySQL ? Например:
GROUP BY fV.tier_id AND 'f.form_template_id'
Ответы:
GROUP BY col1, col2, col3
Да, вы можете группировать по нескольким столбцам. Например,
SELECT * FROM table
GROUP BY col1, col2
Результаты сначала будут сгруппированы по 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 сначала проверяет, есть ли для первого значения столбца разные значения во втором столбце. Если да, то mysql SUM
каждое другое значение второго столбца 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 pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;
Если вы предпочитаете (мне нужно применить это) группу по двум столбцам одновременно, я только что увидел этот момент:
SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1
SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2
. Результаты обычно выглядят так же, как этот ответ, но внутреннее исполнение совсем другое.
GROUP BY CONCAT(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 ;