3

過去30日間から毎日のポイント数を取得する次の関数があります。このクエリは、利用可能な値がある日のみを取得します。その日に付与されたポイントがない場合、何も取得しません。その日にポイントを獲得したかどうかに関係なく、すべての日を表示するにはどうすればよいですか?

例えば:

5 月 31 日 - 30 ポイント。
5 月 30 日 - 0 ポイント。
5 月 29 日 - 5 ポイント。
5 月 28 日 - 10 ポイント。
5 月 27 日 - 0 ポイント。
...

それ以外の:

5 月 31 日 - 30 ポイント。
5 月 29 日 - 5 ポイント。
5 月 28 日 - 10 ポイント。
...

SELECT date_added, SUM(points) 
FROM points_table pt, userCake_Users u 
WHERE pa.date_added >= (CURDATE() - INTERVAL 30 DAY ) 
AND u.user_id = '" . $user_id . "' 
AND u.user_id = pt.user_id 
GROUP BY date(pt.date_added)");
4

2 に答える 2

0

この場合、メモリ内の一時テーブルを使用し、必要に応じてゼロで埋めることができます。

私は次のルーチンを書きました:

SET @start_date = CURDATE() - INTERVAL 30 DAY;

DROP TEMPORARY TABLE IF EXISTS RawResults;
CREATE TEMPORARY TABLE RawResults ENGINE = MEMORY
SELECT date, SUM(test.table.points)
FROM test.table
WHERE test.table.date >= @start_date
GROUP BY test.table.date;

SET @cur_date = @start_date;    
WHILE @cur_date <= CURDATE() DO    
    IF NOT EXISTS (select * from RawResults where date = @cur_date) THEN
        INSERT INTO RawResults VALUES (@cur_date, 0);
    END IF;        
    SET @cur_date =  DATE_ADD(@cur_date, INTERVAL 1 DAY);
END WHILE;

SELECT *
FROM RawResults
ORDER BY date DESC;
于 2012-05-31T10:29:02.010 に答える
0

MySQL は欠落している日付をどこからともなく生成することはできません。そのため、別のテーブル (おそらくエンジン MEMORY) を作成し、そこにクエリの日付を挿入することをお勧めします。次に、上記のようにベース テーブルに参加できます。

select date_added,
(select sum(points_table.points) from points_table where points_table.date_added = inmemorytable.date_added) as "Points"
from inmemorytable
inner join userCake_Users u on u.u.user_id = '" . $user_id . "' AND u.user_id = pt.user_id

これらの構造が手元にないため、テストされていません。内部結合とサブクエリが問題を引き起こす可能性があり、それらを切り替える必要がある場合があります。

于 2012-05-31T10:03:45.180 に答える