Mysql group by несколько полей: Группировка по нескольким столбцам

Группировка по нескольким столбцам

Группировка по нескольким столбцам

Группировка
по нескольким столбцам

В предложениях GROUP BY можно
указывать столько столбцов, сколько вам необходимо, разделяя имена
элементы
списка запятыми. Таким образом, путем группировки одновременно по
нескольким
элементам можно создавать группы внутри групп. Каждый элемент из списка
GROUP
BY должен обязательно присутствовать в списке выбора —
другими словами,
группировать можно только выбираемые элементы.

Пример

SQL:


SELECT region, sex, COUNT(*) AS num_clients


FROM tbl_clients


GROUP BY
region, sex

Результат:





































































region sex num_clients
California f 18
California m 15
Los Angeles f 42
Los Angeles m 57
New Jersey f 12
New Jersey m 21
New York f 15
New York m 18
Oregon f 15
Oregon m 18
Portland f 12
Portland m 32
Seattle f 37
Seattle m 40
Washington f 21
Washington m 11


Сначала строки таблицы разделяются
по городам, а затем каждая полученная группа разделяется по полу
клиента. В
результате получается 16 групп, или наборов. После этого к каждому
такому
набору применяется агрегирующая функция, которая вычисляет для каждого
города
количество клиентов женского и мужского пола.

« Previous | Next »

mysql — GROUP BY по части поля. Возможно ли?

++++++++++++++++++++++++++++++
+ id + title           + num +
++++++++++++++++++++++++++++++
+  1 + name slim       +   5 +
+  2 + name frog       +   6 +
+  3 + name frog       +   2 +
+  4 + nick one        +   8 +
+  5 + nick two        +   3 +
+  6 + nick strong man +   7 +
++++++++++++++++++++++++++++++

Хочу командой GROUP BY сделать группировку, по полю title, но по значению ДО первого пробела

SELECT *
FROM `my_table`
WHERE 1
GROUP BY команда_которую_не_знаю(`title`)
ORDER BY `num` ASC

На выходе охота получить что то типа

++++++++++++++++++++
+ id + title + num +
++++++++++++++++++++
+  3 + name  +   2 +
+  5 + nick  +   3 +
++++++++++++++++++++

Такое возможно? Если да, подскажите как написать запрос

p. s. в данный момент делаю запрос ко всей таблице, и уже после запроса обрабатываю данные


благодаря мудрым советам @Akina — можно сделать запрос

SELECT `id`, SUBSTRING_INDEX(`title`, ' ', 1), `num`
FROM `my_table`
WHERE 1
GROUP BY `title`
ORDER BY `num` ASC

но команда GROUP BY перестает работать

++++++++++++++++++++
+ id + title + num +
++++++++++++++++++++
+  3 + name  +   2 +
+  1 + name  +   5 +
+  2 + name  +   6 +
+  5 + nick  +   3 +
+  6 + nick  +   7 +
+  4 + nick  +   8 +
++++++++++++++++++++
  • mysql
  • sql

7

Непонятно, для чего в выходном наборе поле id. И тем более непонятно, что должно выводиться, если одному и тому же (судя по ORDER BY — минимальному) значению num соответствует несколько разных id

Додумывая задачу, считаю, что наиболее верным будет следующий запрос:

SELECT SUBSTRING_INDEX(`title`, ' ', 1) title, min(`num`) num
FROM `my_table`
-- WHERE 1
GROUP BY SUBSTRING_INDEX(`title`, ' ', 1)
ORDER BY `num` ASC

Если всё же id необходим, то запрос будет таким:

SELECT MIN(t1. id) id, t2.title, t2.num
FROM my_table t1
JOIN (SELECT SUBSTRING_INDEX(`title`, ' ', 1) title, min(`num`) num
      FROM `my_table`
      GROUP BY SUBSTRING_INDEX(`title`, ' ', 1)) t2
   ON SUBSTRING_INDEX(t1.title, ' ', 1) = t2.title
  AND t1.num = t2.num
GROUP BY t2.title, t2.num
ORDER BY num

fiddle

1

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

sql — Можно ли сгруппировать несколько столбцов с помощью MySQL?

Спросил

Изменено
4 года, 2 месяца назад

Просмотрено
483k раз

283

Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.

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

 ГРУППИРОВАТЬ ПО fV.tier_id И 'f.form_template_id'
 
  • mysql
  • sql
  • группа-по

4

 ГРУППИРОВАТЬ ПО col1, col2, col3
 

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

 ВЫБЕРИТЕ * ИЗ таблицы
СГРУППИРОВАТЬ ПО col1, col2
 

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

3

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

В вашем примере вы должны написать

GROUP BY fV.tier_id, f.form_template_id

Между тем код

GROUP BY f. form_template_id, fV.tier_id

даст аналогичные результаты иначе.

 группа по fV.tier_id, f.form_template_id
 

Чтобы использовать простой пример, у меня был счетчик, который должен был суммировать уникальные IP-адреса на посещенную страницу на сайте. Это в основном группировка по имени страницы, а затем по IP. Я решил это с помощью комбинации DISTINCT и GROUP BY.

 ВЫБЕРИТЕ имя страницы, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;
 

1

Если вы предпочитаете (мне нужно применить это) группировать по двум столбцам одновременно, я только что видел этот пункт:

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

1

 ГРУППИРОВКА ПО СЦЕП (столбец1, '_', столбец2)
 

6

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

sql — Использование group by для нескольких столбцов

Здесь я объясню не только использование предложения GROUP, но и использование агрегатных функций.

Предложение GROUP BY используется в сочетании с агрегатными функциями для группировки набора результатов по одному или нескольким столбцам. например:

 -- GROUP BY с одним параметром:
SELECT имя_столбца, AGGREGATE_FUNCTION(имя_столбца)
ОТ имя_таблицы
ГДЕ значение оператора column_name
СГРУППИРОВАТЬ ПО имя_столбца;
-- GROUP BY с двумя параметрами:
ВЫБРАТЬ
    имя_столбца1,
    имя_столбца2,
    AGGREGATE_FUNCTION(имя_столбца3)
ИЗ
    имя_таблицы
ГРУППА ПО
    имя_столбца1,
    имя_столбца2;
 

Запомните этот заказ:

  1. SELECT (используется для выбора данных из базы данных)

  2. FROM (предложение используется для перечисления таблиц)

  3. WHERE (предложение используется для фильтрации записей)

  4. GROUP BY (предложение может использоваться в операторе SELECT для сбора данных
    по нескольким записям и сгруппировать результаты по одному или нескольким столбцам)

  5. HAVING (предложение используется в сочетании с предложением GROUP BY для
    ограничить группы возвращаемых строк только теми, условие которых
    ВЕРНО)

  6. ORDER BY (ключевое слово используется для сортировки набора результатов)

Вы можете использовать все это, если используете агрегатные функции, и это порядок, в котором они должны быть установлены, иначе вы можете получить ошибку.

Агрегатные функции:

MIN() возвращает наименьшее значение в заданном столбце

MAX() возвращает максимальное значение в данном столбце.

SUM() возвращает сумму числовых значений в заданном столбце

AVG() возвращает среднее значение заданного столбца

COUNT() возвращает общее количество значений в данном столбце

COUNT(*) возвращает количество строк в таблице

Примеры SQL-скриптов с использованием агрегатных функций:

Допустим, нам нужно найти заказы на продажу, общая сумма продаж которых превышает 950 долларов. Мы объединяем предложение HAVING и предложение GROUP BY , чтобы добиться этого:

 ВЫБЕРИТЕ
    orderId, SUM(unitPrice * qty) Итого
ИЗ
    Информация для заказа
СГРУППИРОВАТЬ ПО идентификатору заказа
ИМЕЮЩИЙ Всего > 950;
 

Подсчет всех заказов и группировка их по идентификатору клиента и сортировка результата по возрастанию. Мы объединяем функцию COUNT и предложения GROUP BY , ORDER BY и ASC :

 SELECT.
    ID клиента, COUNT(*)
ИЗ
    Заказы
СГРУППИРОВАТЬ ПО идентификатору клиента
ПОРЯДОК ПО СЧЕТУ (*) ASC;
 

Получить категорию со средней ценой за единицу выше 10 долларов США, используя Функция AVG в сочетании с предложениями GROUP BY и HAVING :

 SELECT
    Название категории, AVG (цена за единицу)
ИЗ
    Продукты р
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    Категории c ON c.categoryId = p.categoryId
СГРУППИРОВАТЬ ПО категорииИмя
СРЕДНЯЯ (Цена единицы) > 10;
 

Получение менее дорогого продукта по каждой категории с помощью функции MIN в подзапросе:

 SELECT categoryId,
Код товара,
наименование товара,
цена за единицу товара
ИЗ продуктов п1
ГДЕ unitPrice = (
ВЫБЕРИТЕ МИН. (цена за единицу)
ИЗ продуктов п2
ГДЕ p2.