我的数据库中有一对多的关系,其中一个事件可能有多个日期。我需要找到所有那些没有任何事件超过当前日期的事件(即已经过期的事件)。
我使用以下内容选择所有具有日期的事件:
SELECT events.id AS id,events.picture,events.name,events.venue,events.city
FROM events,event_dates
WHERE event_dates.start_date >= DATE(NOW())
GROUP BY events.id ORDER BY events.id DESC
我试图扭转此问题并不是很聪明,并且获取所有日期为< DATE(NOW())
或NOT event_dates.start_date >= DATE(NOW())
哪个(或两者都不)更接近这个想法。
答案 0 :(得分:2)
你可以简单地做一个不在
之类的地方SELECT * FROM events WHERE events.ID NOT IN
(
your current query here (but only select the id)
)
答案 1 :(得分:1)
使用:
SELECT e.id,
e.picture,
e.name,
e.venue,
e.city
FROM EVENTS e
WHERE NOT EXISTS(SELECT NULL
FROM EVENT_DATES ed
WHERE ed.event_id = e.id
AND ed.start_date >= CURRENT_DATE())
答案 2 :(得分:0)
我知道这有点晚了但是我不喜欢子选择,并且想知道为什么这不能用LEFT JOIN完成?
SELECT events.id AS id,events.picture,events.name,events.venue,events.city 来自事件 LEFT JOIN event_dates ON events.id = event_dates.event_id AND event_dates.start_date&gt; = NOW() WHERE event_dates.ID为null ORDER BY events.id DESC;
关键是将日期测试放在JOIN标准而不是WHERE子句中。我认为它更有效率,特别是如果你在event_dates start_date列上有一个索引?