我一直在寻找谷歌 - 我可能只是愚蠢地理解答案。
我在mysql中有一个表 - 问题。
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO |
| status | varchar(255) | YES |
+-------------+---------------+------+
每个问题都有一个状态。
我正在尝试选择计算所有问题并按状态列出:
SELECT状态,COUNT(*)为'总'FROM问题WHERE(DATE(logged_at)> =)GROUP BY状态
有5种不同的状态 -
报告 不固定 固定 升级 称为
问题是 - 我的选择只显示状态,如果计数> 0.即使count = null,我如何显示所有状态?
我尝试过IFNULL但没有运气。我也看到人们谈论左连接解决方案,但那是多个表问题。
非常感谢!!!
答案 0 :(得分:1)
解决方案是您已经涉及的内容:来自具有所有这5种状态的表的LEFT JOIN
。如果您没有这样的表,您可以将其创建为permament或动态(每次需要时):
SELECT
st.status
, COUNT(issues.status) AS total
FROM
( SELECT 'Active' AS status UNION ALL
SELECT 'Inactive' UNION ALL
...
SELECT 'Super'
) AS st
LEFT JOIN
issues
ON issues.status = st.status
AND issues.logged_at >= ? -- no reason to use DATE() function here
GROUP BY st.status ;
答案 1 :(得分:1)
您需要一个附加表(例如,称为状态)来存储所有状态的列表,即一个与问题表中相同类型的字段,并确保在该字段上放置索引。
然后,下面的SQL应该可以解决这个问题:
select statuses.status,count(issues.id) from issues right join statuses on issues.status=statuses.status group by statuses.status
附加表的优点是,如果您决定拥有其他状态,您只需将其添加到表中,而无需更改任何现有的SQL语句。