组合两个查询以获取总计数和筛选列表

时间:2016-09-08 08:13:20

标签: sql phoenix

我有一个查询,可以获取过去一年内登录过的所有用户ID。

查询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

3 个答案:

答案 0 :(得分:1)

a[1:2]

只运行一次并添加一个条件总和来计算jeffs。

答案 1 :(得分:1)

如果您希望结果只显示像jeff这样的user_name,并且还有整体计数,那么您可以尝试:

需要执行Subselect以获取列中的总计数。更新的查询:

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%'

答案 2 :(得分:0)

试试这个。其他变种。

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;
相关问题