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;
Запомните этот заказ:
SELECT (используется для выбора данных из базы данных)
FROM (предложение используется для перечисления таблиц)
WHERE (предложение используется для фильтрации записей)
GROUP BY (предложение может использоваться в операторе SELECT для сбора данных
по нескольким записям и сгруппировать результаты по одному или нескольким столбцам)HAVING (предложение используется в сочетании с предложением GROUP BY для
ограничить группы возвращаемых строк только теми, условие которых
ВЕРНО)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.