MYSQL 连接 3 个表并计算累积百分比



我在尝试从下表计算累积小组分数时遇到错误:

group_details:
id      name
=====================
1       Group 1
2       Group 2
3       Group 3
group_members:
id      group_id  
======================
1       1           
2       1           
3       2       
4       2       
5       3     
answers:
id      member_id   is_correct      
=================================
1       1           1        
2       1           0      
3       2           1          
4       2           1         
5       3           1          
6       3           0
7       4           0          
8       4           1         

我正在努力实现这一目标:

Group Name            Total Members     Total Score (%)
==============================================
Group 1                  2              75.00
----------------------------------------------
Group 2                  2              50.00
---------------------------------------------- 
Group 3                  1              0
---------------------------------------------- 

运行查询时返回一个空结果。请参阅下面的代码。

SELECT 
((SUM(a.is_correct) / (2 * SUM(m.id))) * 100)  as cummulative_score,
SUM(m.id) as total_members,
g.name
FROM
`group_details` AS g 
LEFT JOIN `group_members` m 
ON m.group_id = g.id
LEFT JOIN `answers` a 
ON a.member_id = m.id 
WHERE a.is_correct = 1
GROUP BY g.id;

此查询将为您提供所需的结果。请注意,根据您问题中的表名,我使用answers作为答案表,如果它实际上被称为answer您将需要更改该JOIN

SELECT 
g.name,
COUNT(DISTINCT m.id) AS `Total Members`,
ROUND(COALESCE(AVG(a.is_correct), 0) * 100, 2) AS `Total Score (%)`
FROM
`group_details` AS g 
LEFT JOIN `group_members` m 
ON m.group_id = g.id
LEFT JOIN `answers` a 
ON a.member_id = m.id 
GROUP BY g.id

输出:

name        Total Members   Total Score (%)     
Group 1     2               75.00
Group 2     2               50.00
Group 3     1               0.00
将"LEFT JOIN答案a">

更改为"LEFT JOIN答案a",它应该可以工作。

此外,我建议避免使用别名,因为您将表临时重命名为"a"、"g"或其他东西没有任何好处,这对每个人来说看起来都非常令人困惑,并且使调试/分析查询非常困难。此外,您应该使用MySQL客户端向您突出显示此类错误,例如MySQL Workbench或类似的东西。

最新更新