3

我一直在寻找谷歌 - 我可能只是愚蠢地理解答案。

我在 mysql 中有一张表 - 问题。

+-------------+---------------+------+-----+---------+----------------+
| Field       | Type          | Null | Key | Default | Extra          |
+-------------+---------------+------+-----+---------+----------------+
| id          | int(11)       | NO   |
| status      | varchar(255)  | YES  |
+-------------+---------------+------+

每个问题都有一个状态。

我正在尝试选择来计算所有问题并按状态列出它们:

SELECT status,COUNT(*) as 'total' FROM issues WHERE (DATE(logged_at) >= ) GROUP BY status

有5种不同的状态-

报告未修复 已修复 已升级 已提交

问题是 - 我的选择仅在 count > 0 时显示状态。即使 count = null 我如何显示所有状态?

我试过 IFNULL 但没有运气。我还看到人们谈论左连接解决方​​案,但那是多表问题。

非常感谢!!!

4

2 回答 2

1

解决方案就是您所进入的:LEFT JOIN来自具有所有这 5 种状态的表。如果您没有这样的表,您可以将其创建为永久或动态(每次需要时):

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 ;
于 2012-08-06T14:37:25.557 回答
1

您将需要一个存储所有状态列表的附加表(例如称为状态),即与问题表中相同类型的一个字段,并确保在该字段上放置索引。

那么下面的 SQL 应该可以解决问题:

select statuses.status,count(issues.id) from issues right join statuses on issues.status=statuses.status group by statuses.status

附加表的优点是,如果您决定拥有另一个状态,您只需将其添加到表中,而无需更改任何现有的 SQL 语句。

于 2012-08-06T14:42:31.840 回答