组合两个查询以获得总计数和过滤列表
Combining two queries to get total count and filtered list
我有一个查询获取过去一年内登录的所有用户 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' 的用户名。
查询 2:
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
查询 2 结果:
user_id user_name
3 jeff
4 aljeffar
预期最终结果:
user_id user_name total_loggedin_users
3 jeff 4
4 aljeffar 4
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;
运行它只是一次,并添加一个条件总和来计算 jeffs。
试试这个。其他变体。
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;
如果您希望您的结果仅像 jeff 一样显示 user_name 并且还有总计数,您可以试试这个:
需要执行子选择以获得列中的总计数。更新查询:
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%'
我有一个查询获取过去一年内登录的所有用户 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' 的用户名。
查询 2:
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
查询 2 结果:
user_id user_name 3 jeff 4 aljeffar
预期最终结果:
user_id user_name total_loggedin_users 3 jeff 4 4 aljeffar 4
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;
运行它只是一次,并添加一个条件总和来计算 jeffs。
试试这个。其他变体。
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;
如果您希望您的结果仅像 jeff 一样显示 user_name 并且还有总计数,您可以试试这个:
需要执行子选择以获得列中的总计数。更新查询:
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%'