Выборки MySQL с подсчетом

Иногда возникают ситуации, требующие подсчета кол-ва вхождения определенного идентификатора в таблице. Например, в таблице комментариев (comments) нужно подсчитать, количество сообщений каждого пользователя. Данные в таблице хранятся следующим образом:

id, user_id, message
1   1            сообщение 1
2   3            сообщение 1
3   3            сообщение 2
4   2            сообщение 1            
5   2            сообщение 2
6   2            сообщение 3
7   2            сообщение 4
8   4            сообщение 1
9   5            сообщение 1

Для определения всех комментариев, написанных каждым из пользователей в определенном интервале дат (после начала 2013 года), используется группировка, с таким запросом:

SELECT COUNT(id) AS count, user_id
FROM db_comments
WHERE create > "2012-12-31 23:23:59"
GROUP BY user_id';

Результат будет таким:

user_id, count
1            1
3            2
2            4
4            1
5            1

Чтобы узнать, кто из пользователей написал по одному комментарию, посылаем в базу такой запрос:

SELECT COUNT(id) AS count, user_id
FROM db_comments
WHERE create > "2012-12-31 23:23:59"
GROUP BY user_id
HAVING count = 1';

Результат обработки запроса к БД MySQL будет таким:

user_id, count
1            1
4            1
5            1

Оператор MySQL HAVING можно считать аналогом оператора WHERE, но только для конструкции группировки GROUP BY.

Чтобы узнать количество записей для каждого из пользователей, написавших минимальное кол-во комментариев, потребуется вложенная выборка:

SELECT COUNT(id) AS count, user_id
FROM db_comments
WHERE create > "2012-12-31 23:23:59"
GROUP BY user_id
HAVING count =
       (SELECT count(id)
        FROM '.DB_TABLE_TRACKING.'
        WHERE create > "2012-12-31 23:23:59"
        GROUP BY db_comments
        ORDER BY count(id) ASC
        LIMIT 1)

Результат обработки запроса к БД MySQL будет таким:

user_id, count
1            1
4            1
5            1

Соответственно, чтобы узнать максимальное количество комментариев и их авторов, во вложенном запросе сортировку ASC нужно изменить на DESC.

Опубликовано: 2013/01/31
HTML-код ссылки на эту страницу:
<a href="https://petrenco.com/mysql.php?txt=163" target="_blank">Выборки MySQL с подсчетом</a>
28234
Добавить комментарий
Ваш e-mail: (не виден посетителям сайта)
Ваше имя:
Комментарий:
Символы с картинки:
Только выделенные поля формы добавления комментариев обязательны к заполнению.