0

私は 2 つの mysql テーブルを持っており、選択クエリを実行したいと考えています。私の目的は、現在の時刻から始まる過去 7 日間の特定のサブスクライバーのポイントを計算することです。最初の表は、サブスクライバーごとに、コンテンツ ID 1、2、または 3 から特定のコンテンツにヒットした時間を示しています。特定の日にコンテンツ ヒットがない可能性があるため、その日はポイントがありません。

ここに画像の説明を入力

ここに画像の説明を入力

テーブルはこれらの写真に示されています。不完全な私の選択クエリ:

   SELECT SUM( points ) AS POINT, DAY FROM
 (SELECT content_hits.content_id, COUNT( * ) * points AS points, 
DATE_FORMAT( hit_time,  "%d-%m-%Y" ) AS  DAY 
FROM content_hits JOIN content 
WHERE content_hits.content_id = content.content_id AND subscriber_id =1
 AND DATE_FORMAT( hit_time,  "%Y-%m-%d" ) > ( CURDATE( ) - INTERVAL 7 DAY )
 GROUP BY content_hits.content_id, DAY) AS tm 
GROUP BY DAY 
ORDER BY DAY DESC

結果を次の図に示します。 ここに画像の説明を入力

17-7-2102 16-7-2012 15-7-2012 14-7-2012 および 12-7-2012 の日のカウントがゼロの結果が得られることを期待しています。なにか提案を?

4

1 に答える 1

1

左結合で使用するカレンダー テーブルを作成する必要がある

CREATE TABLE ints (i INTEGER);
INSERT INTO ints VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

カレンダー テーブルをクエリに左結合します。

 SELECT cal.date,COALESCE(a.point,0) as point
 FROM (
    SELECT DATE_FORMAT(CURDATE() + INTERVAL a.i * 10 - b.i DAY,"%Y-%m-%d") as date
    FROM ints a JOIN ints b
    ORDER BY a.i * 10 - b.i
 ) cal LEFT JOIN 
 (SELECT SUM( points ) AS POINT, DAY FROM
  (SELECT content_hits.content_id, COUNT( * ) * points AS points, 
    DATE_FORMAT( hit_time,  "%Y-%m-%d" ) AS  DAY 
   FROM content_hits JOIN content 
   WHERE content_hits.content_id = content.content_id AND subscriber_id =1
     AND DATE_FORMAT( hit_time,  "%Y-%m-%d" ) > ( CURDATE( ) - INTERVAL 7 DAY )
   GROUP BY content_hits.content_id, DAY) AS tm 
   GROUP BY DAY 
 )a
 ON cal.date = a.day
 WHERE cal.date BETWEEN CURDATE( ) - INTERVAL 7 DAY AND CURDATE()
 ORDER BY cal.date desc;

SQL デモはこちら。

于 2012-07-17T07:16:21.977 に答える