2

私はこのようなテーブルとデータを持っています:

会場テーブルに含まれるもの:id
+ ---- + --------- + | id | 名前| + ---- + --------- + | 1 | 会場1| | 2 | 会場2| --------------- event_dates:id、event_id、event_from_datetime、event_to_datetime、venue_id + ---- + ---------- + --------------------- + ----------- ---------- + ---------- + | id | event_id | event_from_datetime | event_to_datetime | 会場ID| + ---- + ---------- + --------------------- + ----------- ---------- + ---------- + | 1 | 1 | 2009-12-05 00:00:00 | 2009-12-07 00:00:00 | 1 | | 2 | 1 | 2009-12-09 00:00:00 | 2009-12-12 00:00:00 | 1 | | 3 | 1 | 2009-12-15 00:00:00 | 2009-12-20 00:00:00 | 2 | + ---- + ---------- + --------------------- + ----------- ---------- + ---------- +

これが私の要件です。2009-12-0600:00:00に無料になる会場が欲しいです。

私は得る必要があります

| ventue_id |

| 2 |

現在、次のクエリがあります。

ven.id、evtdt.event_from_datetime、evtdt.event_to_datetimeを選択します
会場からven
左参加event_datesevtdt
on(ven.id = evtdt.venue_id)
ここで、evtdt.venue_idはnullです
かどうか('2009-12-06 00:00:00' evtdt.event_from_datetime
                                  およびevtdt.event_to_datetime);
+ ---- + --------------------- + --------------------- +
| id | event_from_datetime | event_to_datetime |
+ ---- + --------------------- + --------------------- +
| 1 | 2009-12-09 00:00:00 | 2009-12-12 00:00:00 |
| 2 | 2009-12-15 00:00:00 | 2009-12-20 00:00:00 |
| 3 | NULL | NULL |
| 5 | NULL | NULL |
+ ---- + --------------------- + --------------------- +

結果に注意すると、日付が2009-12-06 00:00:00の間にある会場ID1は含まれていませんが、他の予約が表示されています。このクエリを修正するのを手伝ってください。

前もって感謝します。

4

3 に答える 3

2
SELECT  *
FROM    venue v
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    event_dates ed
        WHERE   ed.venue_id = v.id
                AND '2009-12-06 00:00:00' BETWEEN ed.event_from_datetime AND ed.event_to_datetime
        )
于 2010-01-12T15:43:15.933 に答える
1
or not ('2009-12-06 00:00:00' between evtdt.event_from_datetime 
                              and evtdt.event_to_datetime);

2009年12月6日は2009年12月5日から2009年7月7日までです...そのため、 venue_id 1除外されています...データから正確に何を抽出しようとしていますか?

作成した結合クエリは、venuesテーブルを取得し、venue_idが一致する各行について、venueテーブルの行のコピーを作成し、一致する行を追加します。だからあなたがちょうどやった場合:

select * 
  from venues ven 
  left join event_dates evtdt 
  on (ven.id=evtdt.venue_id);

それは次のようになります:

+----+---------+------+----------+---------------------+---------------------+----------+
| id | name    | id   | event_id | event_from_datetime | event_to_datetime   | venue_id |
+----+---------+------+----------+---------------------+---------------------+----------+
|  1 | venue 1 |    1 |        1 | 2009-12-05 00:00:00 | 2009-12-07 00:00:00 |        1 |
|  1 | venue 1 |    2 |        1 | 2009-12-09 00:00:00 | 2009-12-12 00:00:00 |        1 |
|  2 | venue 2 |    3 |        1 | 2009-12-15 00:00:00 | 2009-12-20 00:00:00 |        2 |
+----+---------+------+----------+---------------------+---------------------+----------+

次に、関心のある日付がイベントの開始日と終了日の間にないことを示す条件を追加すると、クエリは次のようになります。

select * 
  from venues ven 
  left join event_dates evtdt 
  on (ven.id=evtdt.venue_id) 
  where not ('2009-12-06' between evtdt.event_from_datetime and evtdt.event_to_datetime)

次の結果が得られます。

+----+---------+------+----------+---------------------+---------------------+----------+
| id | name    | id   | event_id | event_from_datetime | event_to_datetime   | venue_id |
+----+---------+------+----------+---------------------+---------------------+----------+
|  1 | venue 1 |    2 |        1 | 2009-12-09 00:00:00 | 2009-12-12 00:00:00 |        1 |
|  2 | venue 2 |    3 |        1 | 2009-12-15 00:00:00 | 2009-12-20 00:00:00 |        2 |
+----+---------+------+----------+---------------------+---------------------+----------+

これらは、MySQLのデータを使用した実際の実験結果です。

提案された日に無料のvenue_idsを取得したい場合は、次のように記述します。

  select ven.id, SUM('2009-12-06' between evtdt.event_from_datetime and evtdt.event_to_datetime) as num_intersects 
    from venues ven left join event_dates evtdt on (ven.id=evtdt.venue_id) 
    group by ven.id
    having num_intersects = 0;

これにより、次のようになります。

+----+----------------+
| id | num_intersects |
+----+----------------+
|  2 |              0 |
+----+----------------+

これは、event_dateテーブルにイベントがない会場がある場合にも(変更なしで)正しい答えを出します。

于 2010-01-12T15:43:08.973 に答える
0

推測では、あなたがからではなく削除した場合

or not ('2009-12-06 00:00:00' between evtdt.event_from_datetime 
                                  and evtdt.event_to_datetime)

これにより、イベント日付から行1が返されますが、他のイベント日付行は返されません。

where句を理解するのが少し難しいので、私は「推測で」と言います。多分あなたは意味します

select ven.id , evtdt.event_from_datetime, evtdt.event_to_datetime 
from venues ven 
left join event_dates evtdt 
on (ven.id=evtdt.venue_id) 
where '2009-12-06 00:00:00' between evtdt.event_from_datetime 
                                  and evtdt.event_to_datetime;
于 2010-01-12T15:45:41.233 に答える