4

生成するクエリを作成しようとしています:

VENUE | 2012-10-01 | 2012-10-02 | 2012-10-03
 01   |  OCCUPIED  |   EMPTY    |  OCCUPIED
 02   |   EMPTY    |   EMPTY    |  OCCUPIED
 03   |  OCCUPIED  |   EMPTY    |   EMPTY

これら2つのテーブルから:

会場表:

venue_id | venue
   1     |   01
   2     |   02
   3     |   03

イベント テーブル:

event_id |    start   |    end     | venue_id
   1     | 2012-10-01 | 2012-10-02 |    1
   2     | 2012-10-03 | 2012-10-04 |    1
   3     | 2012-10-03 | 2012-10-04 |    2
   4     | 2012-10-01 | 2012-10-02 |    3

誰かがこの問題に取り組む最善の方法を提案できますか?

私の現在のアプローチは次のとおりです。

SELECT 
   venue,
   IF(start <= '2012-10-01' AND '2012-10-01' < end, 'OCCUPIED','EMPTY') AS '2012-10-01',
   IF(start <= '2012-10-02' AND '2012-10-02' < end, 'OCCUPIED','EMPTY') AS '2012-10-02',
   IF(start <= '2012-10-03' AND '2012-10-03' < end, 'OCCUPIED','EMPTY') AS '2012-10-03'
FROM Venue as v, Event as e
WHERE e.venue_id = v.venue_id
GROUP BY v.venue

ただし、望ましい結果が得られません...代わりに以下を取得しています:

VENUE | 2012-10-01 | 2012-10-02 | 2012-10-03
 01   |  OCCUPIED  |   EMPTY    |   EMPTY
 02   |   EMPTY    |   EMPTY    |  OCCUPIED
 03   |  OCCUPIED  |   EMPTY    |   EMPTY

私は何を間違っていますか?

4

1 に答える 1

2

奇妙なことに、select ステートメントは、投稿した結果セットにある名前の列さえ返さないということです。また、クエリで「2012-10-02」という日を繰り返していることに気付きました。

SELECT 
   IF(start <= '2012-10-01' AND '2012-10-01' < end, 'OCCUPIED','EMPTY') AS '2012-10-01',
   IF(start <= '2012-10-02' AND '2012-10-02' < end, 'OCCUPIED','EMPTY') AS '2012-10-02',
   IF(start <= '2012-10-03' AND '2012-10-03' < end, 'OCCUPIED','EMPTY') AS '2012-10-03'
FROM Venue as v, Event as e
WHERE e.venue_id = v.venue_id
GROUP BY v.venue

編集:

以下の両方のイベントは同じvenue_idとvenueフィールドを共有し、クエリはvenueによってグループ化されているため、「2012-10-03」のOCCUPIED結果が抑制されます。

event_id |    start   |    end     | venue_id
   1     | 2012-10-01 | 2012-10-02 |    1
   2     | 2012-10-03 | 2012-10-04 |    1

SQL フィドル: http://sqlfiddle.com/#!2/dc33f/20

MAX のような集計関数を追加して、レコードのサブセットに含まれる OCCUPIED オカレンスを取得してみてください。

SELECT e.*, v.venue,
   max(IF(start <= '2012-10-01' AND '2012-10-01' < end, 'OCCUPIED','EMPTY')) AS '2012-10-01',
   max(IF(start <= '2012-10-02' AND '2012-10-02' < end, 'OCCUPIED','EMPTY')) AS '2012-10-02',
   max(IF(start <= '2012-10-03' AND '2012-10-03' < end, 'OCCUPIED','EMPTY')) AS '2012-10-03'
  from event e,
       venue v
where e.venue_id = v.venue_id
GROUP BY v.venue

SQL フィドル: http://sqlfiddle.com/#!2/dc33f/22

于 2012-10-07T15:30:35.283 に答える