Как правильно сгруппировать и посчитать строки в MySQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Когда вам предстоит обрабатывать данные, сгруппированные в MySQL, испытанная формула, которую стоит использовать, помещает в связку COUNT(*) и GROUP BY. Допустим, вы хотите подсчитать количество уникальных категорий в таблице products — следующий запрос отлично справится с этой задачей:

SQL
Скопировать код
SELECT category, COUNT(*) AS total
FROM products
GROUP BY category;

Он группирует строки по полю category и вычисляет их количество в каждой группе, выводя результат в столбце total.

Кинга Идем в IT: пошаговый план для смены профессии

Фильтрация и группировка для конкретных условий

Для подсчёта уникальных значений внутри групп есть COUNT(DISTINCT column). Если вам требуется расчитать количество уникальных товаров на складе, соответствующих определённому condition, прибегните к запросу:

SQL
Скопировать код
SELECT COUNT(DISTINCT serial_number) AS unique_items_count
FROM inventory
WHERE condition = 'met';

Здесь оператор WHERE применён для фильтрации товаров по заданному условию, что помогает уточнить результаты подсчёта.

Вместо подзапросов можно использовать следующий запрос, позволяющий подсчитать количество details по заданному фильтру labref, и при этом не требующий включения подзапросов:

SQL
Скопировать код
SELECT component, COUNT(*) AS count
FROM parts
WHERE labref = 'X123'
GROUP BY component;

Освоение альтернатив подзапросам и высокоуровневых сценариев

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

SQL
Скопировать код
SELECT component, 
       (SELECT COUNT(*) FROM parts p WHERE p.component = c.component) AS count
FROM components c
WHERE labref = 'X123';

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

SQL предлагает мощные возможности, например агрегатную функцию COUNT() с оператором OVER(), которая позволит выполнить более сложный подсчёт внутри групп.

PHP-разработчики, работающие с MySQL, могут использовать функцию mysqli_num_rows для определения числа строк в результате запроса и после этого освободить ресурсы с помощью $result->close();.

Визуализация

Работа с SQL на многое похожа на приготовление фруктового салата: сперва фрукты группируются по видам, а потом подсчитывается количество каждого вида:

Markdown
Скопировать код
🍏🍏🍎🍏🍎🍎🍎🍌🍌🍌🍌 – корзина с фруктами.
🍏🍏🍏 — группа зелёных яблок.
🍎🍎🍎🍎 — группа красных яблок.
🍌🍌🍌🍌 — группа бананов.

И в конце производится подсчёт для каждого типа:

Markdown
Скопировать код
| Фрукт        | Количество |
| -------------|------------|
| 🍏 Зелёные  | 3          |
| 🍎 Красные  | 4          |
| 🍌 Бананы    | 4          |

Так вот, SQL в процессе работы очень похож на процесс сортировки и подсчёта — он прост и нагляден.

Быть в тонусе и не отставать: типичные подводные камни

Столбцы без индексов могут серьёзно замедлить выполнение запросов с ипользованием GROUP BY. Ставьте индексы — это ускорит обработку данных.

NULL-значения могут оказаться нежданными «гостями» в ваших группировках — они подсчитываются как отдельные категории. Избегайте этого эффекта, используя COALESCE, или фильтруйте NULL-значения с помощью условия в WHERE.

Работа с датами может оказаться затруднительной, если не отделить время от даты, поскольку каждый момент времени станет уникальной группой. Чтобы избежать этого, группируйте данные по дате с использованием функции DATE():

SQL
Скопировать код
SELECT DATE(created_at) AS order_date, COUNT(*) AS order_count
FROM orders
GROUP BY order_date;

Настройка запросов для работы с большим объемом данных

С увеличением объёма данных требуется масштабировать запросы, учитывая возрастающую нагрузку. Индексы для столбцов, используемых в GROUP BY, позволят ускорить процесс. Сводные таблицы упростят обращение к часто запрашиваемым большим наборам данных.

Материализованные представления хранят результаты агрегированных запросов, обеспечивая быстрый доступ к ним при дальнейших обращениях.

Не пренебрегайте условными агрегатами, например, использованием CASE или IF внутри COUNT(), что позвоит проводить более сложные вычисления.

Полезные материалы

  1. Свежие вопросы о 'mysql+group-by+count' – Stack Overflow — тут подобраны интересные дискуссии о использовании GROUP BY и COUNT() в MySQL.
  2. SQL GROUP BY | Продвинутый SQL – Mode — здесь представлено подробное руководство по использованию GROUP BY.
  3. Оператор SQL GROUP BY — обучающий материал от W3Schools охватывает все аспекты использования оператора SQL GROUP BY.
  4. Функция MySQL COUNT() с group by – w3resource — коллекция практических примеров работы с COUNT() и GROUP BY в MySQL.
  5. SQL | GROUP BY – GeeksforGeeks — GeeksforGeeks предлагает доступные объяснения и примеры, полезные для ознакомления с GROUP BY.