2
SELECT DATE_FORMAT(createdTimestamp, "%D %b") AS date,
       COUNT(id) AS COUNT
FROM registration
WHERE createdTimestamp BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()
GROUP BY DATE(createdTimestamp)

次のようなものが表示されます

14th Feb - 10
15th Feb - 12
16th Feb - 4
17th Feb - 4
18th Feb - 10
19th Feb - 12
20th Feb - 9

しかし、登録のない日が 1 日ある場合、その日はスキップされます。mysql クエリで 0 として表示するにはどうすればよいですか?

14th Feb - 10
16th Feb - 4
17th Feb - 4
20th Feb - 9

クエリは次のように表示できますか

14th Feb - 10
15th Feb - 0
16th Feb - 4
17th Feb - 4
18th Feb - 0
19th Feb - 0
20th Feb - 9
4

4 に答える 4

2

このクエリは、7 つの数字 (0 から 6) のシーケンスを作成し、curdate とシーケンス番号の間の日差を使用して必要なデータを抽出します。

SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL t.DAY DAY), "%D %b") AS date,
   COUNT(r.id) AS COUNT
FROM
  (SELECT 0 AS 'day'
       UNION ALL SELECT 1
   UNION ALL SELECT 2
   UNION ALL SELECT 3
   UNION ALL SELECT 4
   UNION ALL SELECT 5
   UNION ALL SELECT 6) t
LEFT OUTER JOIN registration r ON DATE_SUB(CURDATE(), INTERVAL t.DAY DAY) = r.createdTimestamp
GROUP BY t.DAY

これはsqlfiddleへのリンクです

于 2013-04-12T09:37:01.100 に答える
1

日付の範囲を取得するには、整数 (0 から 9) のテーブルを取得し、それを結合して必要な数の範囲を取得し、DATE_SUB を使用してそこから日付の範囲を取得します。

次に、その日付の現在のテーブルに対して LEFT OUTER JOIN を実行して、各日付のカウントを取得します。

次のようなもの:-

SELECT DATE_FORMAT(aDate, "%D %b") AS fmtdate, COUNT(registration.id) AS COUNT
FROM (SELECT DATE_SUB(CURDATE(), INTERVAL a.i + b.i*10 DAY) AS aDate
FROM integers a, integers b
WHERE (a.i + b.i*10) <= 7) CountRange
LEFT OUTER JOIN registration
ON aDate = DATE(FROM_UNIXTIME(createdTimestamp))
GROUP BY aDate
ORDER BY aDate

(これは最大 99 日間に対応することに注意してください - 範囲を拡張する方法を示すために、整数で結合を行いました)

編集-タイムスタンプがUNIXタイムスタンプとして保存されていると仮定したため、上記のコードは FROM_UNIXTIME を使用しています。私の仮定が間違っている場合、その関数呼び出しを簡単に削除できます

于 2013-04-12T09:31:58.760 に答える
1

現在のクエリでは不可能です。クエリは、そこにないものでグループ化できません。不足しているデータを生成する必要があります。

テーブルとして選択する日付のリストを選択し、これを日付でデータに OUTER JOIN し、生成された日付テーブルのデータ列でグループ化します。

編集: この方法で結合する日付の表を生成できます (例: 2 日間):

select * from (select subdate(current_date,0)) a union (select subdate(current_date,1) b);
于 2013-04-12T08:51:49.223 に答える