我有一系列活动。
| TABLE: events
| event_id | event_location | event_date |
|----------|----------------|------------|
| 10 | Denver | 2014-02-01 | *
| 11 | Chicago | 2014-04-01 | *
| 12 | Denver | 2014-06-01 |
| 13 | Seattle | 2014-08-01 | *
| 14 | Chicago | 2014-10-01 |
| 15 | Denver | 2014-11-01 | *
我还有一个位置访问列表,该列表已过时。
| TABLE: allowed
| allowed_location | date_begin | date_end |
|------------------|------------|------------|
| Denver | 2014-01-01 | 2014-03-01 |
| Chicago | 2014-03-01 | 2014-05-01 |
| Seattle | 2014-07-01 | 2014-09-01 |
| Denver | 2014-10-01 | 2014-12-01 |
我想要找到的是所有event_id,它们的event_date位于其各自的allowed_location行之间(date_begin和date_end)。
符合标准的第一个表的结果用上面的星号表示。
我可以通过以下查询得到一些结果,但不能得到我想要的结果:
SELECT event.event_id
FROM event
LEFT JOIN
(SELECT allowed_location,
date_begin,
date_end
FROM allowed) AS allowed ON allowed.allowed_location=event.event_location
WHERE (event.event_date >= allowed.date_begin)
AND (event.event_date <= allowed.date_end)
这会给我一些结果,但它只会从允许的表中加入一个结果。我不能用一种方法来检查事件的日期是否在该位置的任何允许日期范围之间。
任何帮助都将不胜感激。
答案 0 :(得分:0)
一个简单的JOIN
return a row matching each row combination allowed by the ON
condition。从那里,您只需要过滤掉那些具有不匹配日期的那些。 (另请注意BETWEEN
运算符,它使基于范围的比较更加简单。)
SELECT e.event_id
FROM events e
JOIN allowed a ON a.allowed_location = e.event_location
WHERE e.event_date BETWEEN a.date_begin AND a.date_end
答案 1 :(得分:0)
您的查询看起来是正确的。但是,您可以使用inner join
而不是left join
来编写它,并且不需要from
子句中的子查询。
SELECT e.event_id
FROM event e JOIN
allowed a
ON a.allowed_location = e.event_location
WHERE (e.event_date >= a.date_begin) AND (e.event_date <= a.date_end);