10

過去 1 年間に提出されたレポートの数を日付順に並べたクエリを作成しています。私はphpで現在の年と月を取得します:

$year = date('Y') - 1;
$month = date('m');

次のクエリを実行します: SQL:

SELECT month(date_lm) AS `month` ,
count(*) AS `count`
FROM `reports` 
WHERE (status = 'submitted') 
AND (date_lm > 2012-08) 
GROUP BY month(date_lm) 
ORDER BY month(date_lm) ASC

そして、昨年は1件しか提出されていないため、結果は1件しかありません...

| month  |  count  |
|   7    |    1    |

しかし、結果セットに次のように表示したいと思います。

| month  |  count  |
|   9    |    0    |
|   10   |    0    |
|   11   |    0    |
|   12   |    0    |
|   1    |    0    |
|   2    |    0    |
|   3    |    0    |
|   4    |    0    |
|   5    |    0    |
|   6    |    0    |
|   7    |    1    |
|   8    |    0    |

それは可能ですか?

4

4 に答える 4

3

これを行うには、「月」テーブルを作成し、そのテーブルとレポート テーブルの間に左外部結合を使用します。

私は mysql を使用したことがないので、構文が少しずれている場合は申し訳ありませんが、これはクエリになります。

SELECT months.monthNumber,
    count(reports.id) AS `count`
FROM `months` left outer join `reports` on months.monthNumber = month(reports.date_lm) 
WHERE (status = 'submitted') 
AND (date_lm > 2012-08) 
GROUP BY monthNumber
ORDER BY monthNumber ASC

重要なことは、数は月テーブルではなく、レポート テーブルの列である必要があることです。そうしないと、ゼロになることはありません。

于 2013-08-23T07:45:50.523 に答える
3

count(col_name) AScountは count 0 を返します

参考までに、http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/にアクセスしてください。

于 2013-08-23T07:46:15.213 に答える
2

このテーブルを 1..12 テーブルと LEFT JOIN する必要があります。このようなもの:

SELECT  Months.id AS `month` ,
COUNT(`reports`.date_lm) AS `count`
FROM 
(
  SELECT 1 as ID UNION SELECT 2 as ID UNION  SELECT 3 as ID UNION SELECT 4 as ID 
  UNION  
  SELECT 5 as ID UNION SELECT 6 as ID UNION SELECT 7 as ID UNION SELECT 8 as ID 
  UNION  
  SELECT 9 as ID UNION SELECT 10 as ID UNION SELECT 11 as ID UNION SELECT 12 as ID
) as Months
LEFT JOIN `reports` on Months.id=month(`reports`.date_lm)
                       AND 
                       (status = 'submitted') 
                       AND (date_lm > 2012-08)
GROUP BY Months.id 
ORDER BY Months.id ASC

SQL フィドルのデモ

于 2013-08-23T07:50:22.097 に答える