Подсчитывать строки, которые выполняются более одного и двух раз по одному запросу

#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
  

Демонстрация на dbfiddle

Ответ №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)