0

欠落している日付に利用可能な最後の値を入力する必要があるため、最初のステップで、日次テーブルで欠落している日付を含むすべての日付でクエリを取得します。欠落している日付を埋めることについて多くの質問があることは知っていますが、ここではそのクエリに where 句が必要です。通常、すべての日付を含む別のテーブルを作成し、他のテーブルとの左結合を使用してすべての日付を取得することをお勧めします。欠落している値については、NULL を取得しますが、これは問題ありません。

だから私はそのテーブルを作成し、それをカレンダーと呼び、このクエリを試しました:

SELECT d.`date`, s.`item`, s.state 
FROM calendar d LEFT JOIN daily_states s
ON d.`date` = s.`date`
WHERE s.`item` = 'item1'
ORDER BY s.`date` ASC;

結果が得られることを願っています(example1):

Date        | Item  | State

2013-05-01    item1   state1
2013-05-02    item1   state1
2013-05-03    NULL    NULL
2013-05-04    item1   state3
2013-05-05    NULL    NULL
2013-05-06    item1   state3
2013-05-07    item1   state1

item の NULL 値のみが実際には item1 であると確信していますが、右側のテーブルに日付がありません。そうすれば、後で欠落しているアイテムと状態の値を以前の状態で埋めて、この結果で終了できます(example2):

2013-05-01    item1   state1
2013-05-02    item1   state1
2013-05-03    item1   state1
2013-05-04    item1   state3
2013-05-05    item1   state3
2013-05-06    item1   state3
2013-05-07    item1   state1

しかし、WHERE句のために、私はこれ(結果)を取得します:

2013-05-01    item1   state1
2013-05-02    item1   state1
2013-05-04    item1   state3
2013-05-06    item1   state3
2013-05-07    item1   state1

だから私はまだ欠落している日付を持っていません。example1のように結果を得るには? ところで、私は例でSQLfiddleを作りました。事前にt​​hx!

4

1 に答える 1

1

NULL 値も取得します。

を追加

OR s.item IS NULL

あなたのwhere節で

SELECT d.`date`, s.`item`, s.state 
FROM calendar d LEFT JOIN daily_states s
ON d.`date` = s.`date`
WHERE s.`item` = 'item1' OR s.item IS NULL
ORDER BY d.`date` ASC;

ちなみに私はd.date, not s.date(nullの可能性があります) で注文します

SqlFiddle

于 2013-06-12T10:21:46.817 に答える