Объединение двух запросов для получения общего количества и отфильтрованного списка

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

Запрос1:

SELECT user_id, user_name
FROM logins
WHERE login_date BETWEEN "2015-09-01" AND "2016-09-01"
GROUP BY user_id;

Execution time: 625ms

И еще один запрос, аналогичный приведенному выше, теперь с дополнительными фильтрами для отображения имен пользователей с «jeff».

Query2:

SELECT user_id, user_name
FROM logins
WHERE login_date BETWEEN "2015-09-01" AND "2016-09-01"
AND user_name LIKE '%jeff%'
GROUP BY user_id;

Execution time: 587ms

Общее время выполнения составляет 1212 мсек.

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

Проблема в том, что мне нужно выполнить оба запроса, а это занимает больше времени.

Есть ли способ объединить оба запроса в один и получить нужные мне данные, то есть общее количество вошедших в систему пользователей и список вошедших в систему пользователей с user_name, например 'jeff'? в то же время минимизируя время выполнения?


Образец данных:

user_id user_name   login_date
1   annie       2015-10-02
2   greg        2015-12-25
3   jeff        2015-11-05
4   aljeffar    2016-03-06
5   jeff1       2015-07-07
2   greg        2016-01-30
1   annie       2015-11-13
3   jeff        2016-02-14
2   greg        2016-09-30
3   jeff        2016-07-04

Запрос1 Результат:

user_id   user_name   
1 annie       
2 greg        
3 jeff        
4 aljeffar
Total result count: 4 -- this should be the fix value of total_loggedin_users column below

Query2 Результат:

  user_id user_name
  3   jeff    
  4   aljeffar

Ожидаемый окончательный результат:

user_id   user_name   total_loggedin_users
3 jeff        4
4 aljeffar    4

person vhen    schedule 08.09.2016    source источник
comment
Добавьте образец данных таблицы и ожидаемый результат. (Мне проблема не ясна.)   -  person jarlh    schedule 08.09.2016
comment
Покажите нам ожидаемый результат полностью, включая Энни и т. Д.!   -  person jarlh    schedule 08.09.2016
comment
этот результат должен быть результатом вашего второго запроса. за исключением того, что вам также нужно выбрать login_date. Меня смущает ваш вопрос о том, как получить общее количество джеффов и увидеть желаемый результат ...   -  person Nebi    schedule 08.09.2016
comment
учитывается ли каждый вход в систему одним пользователем для total_loggedin_users или пользователь считается только один раз, независимо от того, сколько входов в систему было у этого пользователя?   -  person Nebi    schedule 08.09.2016
comment
@Nebi total_loggedin_users должно быть счетчиком результатов первого запроса.   -  person vhen    schedule 08.09.2016
comment
Вам помог ответ? Затем отметьте это как ответ. Так что на вопрос дан ответ.   -  person Nebi    schedule 09.09.2016


Ответы (3)


SELECT 
       user_id, 
       count(*) as total, 
       sum(case when user_name LIKE '%jeff%' then 1 else 0 end) as jeff_count
FROM logins
WHERE login_date BETWEEN "2015-09-01" AND "2016-09-01"
GROUP BY user_id;

Запустите его только один раз и добавьте условную сумму для подсчета Джеффов.

person StanislavL    schedule 08.09.2016
comment
запрос хорош, но мне нужен список Джеффов, а не только количество. - person vhen; 08.09.2016
comment
Этот запрос суммирует сумму только в том случае, если user_id одинаков, а не для всех пользователей с user_name, например "% jeff%". Потому что вы группируете по user_id. Итак, чтобы получить количество всех jeff, вам нужно иметь внешний выбор с суммой jeff_count. - person Nebi; 08.09.2016
comment
СЛУЧАЙ КОГДА работал у меня без СУММЫ (). И в своей системе я подсчитываю записи, возвращенные приведенным выше запросом, и использую array_filters, чтобы получить список jeffs. - person vhen; 13.09.2016

Если вы хотите, чтобы в вашем результате отображалось только user_name, например jeff, а также общее количество, вы можете попробовать следующее:

Требуется выполнить подвыбор, чтобы получить общее количество в столбце. Обновленный запрос:

SELECT  [USER_ID] ,
        [USER_NAME] ,
        CountAll
FROM    ( SELECT    [USER_ID] ,
                    [USER_NAME] ,
                    -- Window-Function (Only in SQL-Server) to get overall count
                    COUNT([USER_ID]) OVER ( ) AS CountAll
          FROM      dbo.logins
          WHERE     login_date BETWEEN '2015-09-01' AND '2016-09-01'
          --Group so we don't count multiple logins of one user 
          GROUP BY  [USER_ID] ,
                    [USER_NAME]
        ) subselect
WHERE   [USER_NAME] LIKE '%jeff%'
person Nebi    schedule 08.09.2016
comment
обновил запрос, чтобы в столбце было общее количество. - person Nebi; 08.09.2016

Попробуй это. Другой вариант.

SELECT user_id, user_name, GROUP_CONCAT(user_name) AS list_of_jeffs, COUNT(*) AS total, SUM(IF(user_name LIKE "%jeff%",1,0)) as jeff
FROM `pt_terminal` 
WHERE login_date BETWEEN "2015-09-01" AND "2016-09-01" 
GROUP BY user_id;
person aimprogman    schedule 08.09.2016