В этом запросе используются две таблицы, и все, что имеет значение в результате, - это количество пользователей, которые до сих пор не оставили ни одного комментария. В таблице user
, конечно, есть столбец id
, который является внешним ключом в таблице comment
, обозначенным столбцом user_id
.
Первый супер-простой запрос группирует пользователей по тому, есть ли у них какие-либо комментарии. Он выводит две строки (строку с количеством пользователей, у которых есть комментарии, и строку с количеством пользователей, у которых нет комментариев), с двумя столбцами (количество пользователей и то, отправили ли они какие-либо комментарии).
SELECT
COUNT(id) AS user_count,
IF( id IN ( SELECT user_id FROM `comment` ), 1, 0) AS has_comment
FROM `user`
GROUP BY has_comment
Пример того, как выходные данные будут выглядеть здесь:
+------------+-------------+
| user_count | has_comment |
+------------+-------------+
| 150 | 0 |
| 140 | 1 |
+------------+-------------+
Теперь вот мой вопрос. Здесь я хочу получить немного больше информации, сгруппировав этих пользователей в 3 группы:
- Пользователи, которые не оставили комментариев
- Пользователи, которые оставили меньше 10 комментариев
- Пользователи, которые опубликовали 10 или более комментариев
И лучший запрос, который я знаю, как написать для этой цели, заключается в следующем, который работает, но, к сожалению, выполняет 4 подзапроса и имеет 2 производные таблицы:
SELECT
COUNT(id) AS user_count,
CASE
WHEN id IN ( SELECT user_id FROM ( SELECT COUNT(user_id) AS comment_count, user_id FROM `comment` GROUP BY user_id HAVING comment_count >= 10 ) AS a) THEN '10 or more'
WHEN id IN ( SELECT user_id FROM ( SELECT COUNT(user_id) AS comment_count, user_id FROM `comment` GROUP BY user_id HAVING comment_count < 10 ) AS b) THEN 'less than 10'
ELSE 'none'
END AS has_comment
FROM `user`
GROUP BY has_comment
Пример вывода здесь будет примерно таким:
+------------+-------------+
| user_count | has_comment |
+------------+-------------+
| 150 | none |
| 130 | less than 10|
| 100 | 10 or more |
+------------+-------------+
Этот второй запрос; можно ли его написать проще и эффективнее, и все же дать такой же результат? (потенциально может быть даже расширен на большее количество таких «групп»)