我在SQL中有一个表,它是用户登录网站的列表。它看起来很像:
id | date | status
------------------
状态可以是0表示不办理登机手续,1表示办理登机手续,2表示不办理登机手续,3表示不办理登机手续。
我正在尝试构建一个列出status = 0
所有行的单个查询,但也有一个COUNT,表示每个特定status = 3
上有多少行id
。
这可能吗?
答案 0 :(得分:7)
只需加入由id加入的计数。
SELECT t.*, COALESCE(t1.status_3_count, 0) as status_3_count
FROM yourtable t
LEFT JOIN
( SELECT id, SUM(status=3) as status_3_count
FROM yourtable
GROUP BY id
) t1 ON t1.id = t.id
WHERE t.status = 0
注意:这是做布尔值(也就是计数).. 表达式返回true或false a 1或0.所以我总结那些以返回每个id的status = 3的计数
SELECT id, SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) as status_3_count
FROM yourtable
GROUP BY id
或只使用WHERE status = 3
和COUNT(id)
答案 1 :(得分:1)
尝试依赖子查询:
SELECT t1.*,
( SELECT count(*)
FROM sometable t2
WHERE t2.id = t1.id
AND t2.status = 3
) As somecolumnname
FROM sometable t1
WHERE t1.status=0
答案 2 :(得分:0)
您可以使用联接。编写一个查询,将获得状态为零的所有行:
SELECT *
FROM myTable
WHERE status = 0;
然后,编写子查询以通过按ID分组来获取每个id的状态3的计数:
SELECT COUNT(*)
FROM myTable
WHERE status = 3
GROUP BY id;
由于你想要第一个表中的所有行(至少是我想象的那样),你可以像第二个表一样使用LEFT JOIN:
SELECT m.id, m.status, IFNULL(t.numStatus3, 0)
FROM myTable m
LEFT JOIN (SELECT id, COUNT(*) AS numStatus3
FROM myTable
WHERE status = 3
GROUP BY id) t ON m.id = t.id
WHERE m.status = 0;
以上内容仅显示包含状态为0的ID的行的计数。希望这就是您要查找的内容。如果不是,请发布一些示例数据和预期结果,我会帮助您尝试联系它。这是一个SQL Fiddle示例。