【问题标题】:MySQL subquery for group by fields用于按字段分组的 MySQL 子查询
【发布时间】:2017-09-02 13:39:13
【问题描述】:

我有一个名为会话的 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

【问题讨论】:

  • 能贴出相关的表结构吗?有些人——包括我在内——对如何在没有它的情况下开始解决你的问题感到困扰......
  • 同意@Bagus Tesa。共享表架构
  • @Bagus Tesa 我如何发布表结构?它是一个包含 session_date、user_id、am_pm、code_id、session_year、user 的基本表。前 3 个字段必须是唯一的
  • 嗨@Ahmed,您可以将Entity Relaionship Diagram 放入ascii 样式(就像您将sql 查询放在那里一样),或者截取您的sql 表结构.. 使用explain <table_name>实例..
  • @Bagus Tesa 我在桌子上运行了一个解释语法并用结果更新了帖子。

标签: mysql subquery


【解决方案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;

【讨论】:

  • 似乎在正确的轨道上,但是当我运行第二个代码时,每个 user_id 的出勤率完全错误。有什么想法有什么问题吗?我在帖子中的第一个示例获取了所有内容的出勤率,因此如果相同的语法在第二部分中有一个 ap.user_id= 子句和一个 user_id= 子句,那么它应该给我每个 user_id 的正确百分比
  • 我们还需要在sessions 表的查询中添加user_id。我已经更新了答案,现在试试?
  • 太棒了,有没有办法将结果乘以 100 以获得实际百分比? 98.45% 的值为 0.9845
  • 我将 *100 放在第 1 行的末尾 user_id = a.user_id) * 100 是否正确?我可以把 * 100 AS 百分比这样字段名称是百分比吗?
  • 是的,没关系。
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多