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 より大きい場合にのみ select が Status を表示することです。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

すべてのステータスのリストを格納する追加のテーブル (たとえば、ステータスと呼ばれる) が必要になります。つまり、課題テーブルと同じタイプの 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 に答える