2016-11-03 12 views
0

私は、次のような状況があります。日付範囲に一致する日付の一致を表示する方法

+------------+-----------+------------+----------------+ 
| date  | event  | start_date | duration(days) | 
+------------+-----------+------------+----------------+ 
| 2010-01-01 | concert | 2010-01-01 | 2    | 
+------------+-----------+------------+----------------+ 
| 2010-01-02 | NULL  | NULL  | NULL   | 
+------------+-----------+------------+----------------+ 
| 2010-01-03 | workshops | 2010-01-03 | 3    | 
+------------+-----------+------------+----------------+ 
| 2010-01-04 | NULL  | NULL  | NULL   | 
+------------+-----------+------------+----------------+ 
| 2010-01-05 | NULL  | NULL  | NULL   | 
+------------+-----------+------------+----------------+ 
| 2010-01-06 | NULL  | NULL  | NULL   | 
+------------+-----------+------------+----------------+ 
| 2010-01-07 | NULL  | NULL  | NULL   | 
+------------+-----------+------------+----------------+ 
| 2010-01-08 | festival | 2010-01-08 | 5    | 
+------------+-----------+------------+----------------+ 
| 2010-01-09 | NULL  | NULL  | NULL   | 
+------------+-----------+------------+----------------+ 

は今、私はすべての日付の行のために、特定のイベントが起こっている方法で、上記の情報を表示する必要が名前は、開始時の最初の日だけでなく、イベント列にも表示されます。

3つのテーブル、DATESだけと1、EVENTSSTART_DATESと各イベントのDURATIONと1と1があります。

これまでのところ、私は上記のようなテーブルしか作成できませんでしたが、NULL値をイベントの期間の各日のイベント名に置き換える方法はわかりません。

SELECT d AS date, event, start_date, duration 
FROM dates 
LEFT JOIN info ON info.start_date=d.date AND city='LA' 
LEFT JOIN events ON events.event=info.event 
WHERE d BETWEEN '2010-01-01' AND '2010-01-09' 

以下
+0

、日付、イベントAS – Galz

+0

SELECT dは、クエリを共有してください。開始日、継続時間 日付から LEFT JOIN情報ON info.start_date = d.date AND city = 'LA' LEFT JOIN events ON events.event = info.event ここで '2010-01-01' AND '2010 -01-09 ' – tabaluga

+0

デザインを変更することを検討できますか?開始日と終了日を保存する代わりに、開始日と終了日を保存できますか?それはあなたの人生をはるかに簡単にします! – Galz

答えて

0

は - 、彼らの開始日と終了日ですべてのイベントを示してサブクエリを作成した後、日付の完全なリストに参加:

SELECT d.date, t.event, t.start_date, t.end_date 
FROM dates d 
LEFT JOIN (SELECT e.event, i.start_date, i.start_date + INTERVAL i.duration DAY AS end_date 
      FROM events e 
      JOIN info i 
       ON e.event = i.event 
      WHERE i.city = 'LA' 
      ) t 
    ON d.date BETWEEN t.start_date AND t.end_date 
WHERE d.date BETWEEN '2010-01-01' AND '2010-01-09' 
ORDER BY d.date, e.event_name; 
+0

私はデザインを変更することはできません。 ON e.event = d.event の日付を持つdテーブルには、イベントに関連する列がないため、問題があるようです。それは情報テーブル – tabaluga

+0

@ tabalugaの開始日に関連する日付のみを持っています - 申し訳ありません、今修正されました。 – Galz

+0

あなたはどれくらい速く正確で、あなたは@Galzですか? ご協力いただきありがとうございます。次回はすぐに手に入れたいと思います! – tabaluga

関連する問題