Mysql 单个查询中的多个select count(*)

Mysql 单个查询中的多个select count(*),mysql,Mysql,我有一个类似上面的mysql表(tbl_subscriptiondetails) “测试状态”只能有可能的值C、S和Y。 使用单个查询,我希望以以下方式获取数据 如下图所示 但是我正在使用的查询给了我不想要的结果 SELECT pkg_name, (SELECT COUNT(*) FROM tbl_subscriptiondetails WHERE test_status='C' AND mem_id=3) AS completed, (SELECT COUNT(*) FROM t

我有一个类似上面的mysql表(tbl_subscriptiondetails) “测试状态”只能有可能的值C、S和Y。 使用单个查询,我希望以以下方式获取数据 如下图所示

但是我正在使用的查询给了我不想要的结果

    SELECT pkg_name, 
(SELECT COUNT(*) FROM tbl_subscriptiondetails WHERE test_status='C' AND mem_id=3) AS completed, 
(SELECT COUNT(*) FROM tbl_subscriptiondetails WHERE test_status='S' AND mem_id=3) AS started, 
(SELECT COUNT(*) FROM tbl_subscriptiondetails WHERE test_status='Y' AND mem_id=3) AS remaining 
FROM tbl_subscriptiondetails 
WHERE mem_id=3 
GROUP BY pkg_name
结果是


请告诉我出了什么问题。提前感谢。

您正在为每个计数运行子查询,而不是将计数作为主查询的一部分。因此,您的筛选条件的行为与您预期的不同。您可以这样更改它,以执行条件计数:

SELECT pkg_name, 
SUM( case when test_status='C' then 1 else 0 end) AS completed, 
SUM( case when test_status='S' then 1 else 0 end) AS started, 
SUM( case when test_status='Y' then 1 else 0 end) AS remaining 
FROM  tbl
WHERE mem_id = 3
GROUP BY pkg_name

您有独立的查询。尝试添加依赖项:
和t1.pkg_name=t.pkg_name
您的剩余逻辑应该是“S”+“Y”?您也可以编写它而不需要子查询:
选择SUM(IF(test_status='C',1,0))
IF
'sbetter将mem_id排除到何处