#mysql
#mysql
Вопрос:
У меня есть таблица, похожая на: (На самом деле строк намного больше.)
user_id | text
---------------------------
1 | a
1 | b
2 | c
3 | d
3 | e
4 | f
4 | g
4 | h
4 | i
5 | j
5 | k
5 | l
6 | m
Я хочу знать, сколько пользователей появлялось более одного раза и сколько пользователей появлялось среди них более двух раз.((4, 2) для приведенной выше таблицы)
Сейчас я использую этот запрос, но мне приходится запускать его два раза после изменения числа на 2.
SELECT COUNT(*)
FROM (
SELECT NULL
FROM my_table
GROUP BY user_id
HAVING COUNT(*) > 1
) T1
Поскольку таблица такая большая, это занимает много времени. Могу ли я обработать эти два случая в одном запросе?
Ответ №1:
Вы можете сделать это в одном запросе путем суммирования подсчетов:
SELECT SUM(count > 1) AS more_than_once,
SUM(count > 2) AS more_than_twice
FROM (SELECT COUNT(*) AS count
FROM my_table
GROUP BY user_id
HAVING count > 1) t
Вывод:
more_than_once more_than_twice
4 2
Ответ №2:
попробуйте вот так, приятель
SELECT COUNT(*)
FROM (
SELECT NULL
FROM my_table
GROUP BY user_id
HAVING COUNT(*) > 1
) T1 WHERE COUNT(*) > 2
Ответ №3:
SELECT SUM(v.gt1) AS cnt_gt_1
, SUM(v.eq3) AS cnt_eq_2
, SUM(v.gt2) AS cnt_gt_2
FROM ( SELECT COUNT(*) > 1 AS gt1
, COUNT(*) = 2 AS eq2
, COUNT(*) > 2 AS gt2
FROM mytable t
GROUP
BY t.user_id
HAVING COUNT(*) > 1
) v
Для выполнения запроса встроенного просмотра нам нужен индекс с user_id в качестве начального столбца … например
... ON my_table (user_id)