用于按字段分组的MySQL子查询

时间:2017-09-02 13:39:14

标签: mysql subquery

我有一个名为sessions的MySQL表,这个表有user_id出席的会话出席日期。我可以通过使用以下语法获得平均出勤率,该语法基本上将总出席会话数除以总可能会话数并将其乘以100.这样就可以得出给定日期范围的整体平均值。

SELECT (
(SELECT count(*) as total FROM sessions ap JOIN session_codes codes USING (code_id) WHERE ap.session_year=2017 AND (ap.session_date BETWEEN '2017-01-15' AND '2017-05-10') AND codes.status>=1) / 
(SELECT count(*) as total_sessions FROM sessions WHERE (session_date BETWEEN '2017-01-15' AND '2017-05-10') AND session_year=2017)
) * 100 AS percentage

但是,我想要做的是按user_id对结果进行分组,并为每个user_id运行某种子查询,如上所示,但也有一个子句说明user_id是循环中的那个。这样我就可以获得个人用户的百分比,并且结果看起来像这样:

user_id   attendance
1211      89
3344      96

有谁知道如何实现这一目标?

我在会话表上运行了解释语法,这就是我的会话表的外观:

user_id         bigint(20)   NO    PRI  NULL
session_year    year(4)      NO    PRI  NULL
session_date    date         NO    PRI  NULL
am_pm           bigint(20)   NO    PRI  NULL
code_id         bigint(20)   YES        NULL
user            varchar(50)  YES        NULL

1 个答案:

答案 0 :(得分:1)

您可以使用GROUP BY,例如:

SELECT user_id, count(*) as total 
FROM sessions ap JOIN session_codes codes USING (code_id) 
WHERE ap.session_year=2017 AND (ap.session_date BETWEEN '2017-01-15' AND '2017-05-10') AND codes.status>=1
GROUP BY user_id

这将为您提供用户出席。您现在可以将其除以总计以获得百分比,例如:

SELECT a.user_id, a.total / (SELECT count(*) as total_sessions FROM sessions WHERE (session_date BETWEEN '2017-01-15' AND '2017-05-10') AND session_year=2017 and user_id = a.user_id)
FROM (
   SELECT user_id, count(*) as total 
   FROM sessions ap JOIN session_codes codes USING (code_id) 
   WHERE ap.session_year=2017 AND (ap.session_date BETWEEN '2017-01-15' AND '2017-05-10') AND codes.status>=1
   GROUP BY user_id
) a;
相关问题