尽管数据库中有多行,但计数仅显示一行

时间:2018-08-05 17:48:51

标签: mysql sql

这是我的SQL查询:

SELECT 
    COUNT(CASE WHEN  `urgency`='1' THEN 1 END) AS verylow,
    COUNT(CASE WHEN  `urgency`='2' THEN 1 END) AS low,
    COUNT(CASE WHEN  `urgency`='3' THEN 1 END) AS standard,
    COUNT(CASE WHEN  `urgency`='4' THEN 1 END) AS high,
    COUNT(CASE WHEN  `urgency`='5' THEN 1 END) AS critical,
    tbl_users.userName
FROM 
    notes, tbl_users 
WHERE 
    notes.responsible = tbl_users.userID
    AND project_id = '4413' 
    AND (notes.status = 'Ongoing' OR notes.status = 'Not started')

,输出为:

verylow   low   standard   high   critical    userName
5          1       2         1        1        Nick

但是这是错误的,因为我在数据库中有多个分配任务的用户。在我的数据库中看起来像这样:

urgency userName
3       Nick
5       Nick
4       Nick
3       James
1       James
1       Nick
2       Nick
1       James
1       Nick
1       Nick

有人知道为什么它不计算其他用户的紧迫性,以及他有多少种不同的紧迫性?

2 个答案:

答案 0 :(得分:3)

您在做什么并不完全正确。如果打开MySQL模式ONLY_FULL_GROUP_BY,则会收到警告,因为您选择的列不在GROUP BY子句中,而未应用聚合函数。因此,您需要一个GROUP BY子句。

整个查询应如下所示:

SELECT 
    COUNT(CASE WHEN  `urgency`='1' THEN 1 END) AS verylow,
    COUNT(CASE WHEN  `urgency`='2' THEN 1 END) AS low,
    COUNT(CASE WHEN  `urgency`='3' THEN 1 END) AS standard,
    COUNT(CASE WHEN  `urgency`='4' THEN 1 END) AS high,
    COUNT(CASE WHEN  `urgency`='5' THEN 1 END) AS critical,
    tbl_users.userName
FROM 
    notes, tbl_users 
WHERE 
    notes.responsible = tbl_users.userID
    AND project_id = '4413' 
    AND (notes.status = 'Ongoing' OR notes.status = 'Not started')
GROUP BY tbl_users.userName;

答案 1 :(得分:0)

使用COUNT汇总行。由于没有GROUP BY子句,因此将它们聚合到一行(而不是每个用户说一行)。

您正在选择userName。哪一个?当您只选择一行时,DBMS会任意选择一行。