Select 只有没有未来日期的记录通过加入

Select only records without future dates via join

有 2 个 table:事件和日期。一个事件可以有多个日期。

我只想select那些在未来没有相应日期的事件。

我尝试了以下查询

SELECT e.id_event FROM events e RIGHT JOIN dates d ON e.id_event=d.id_event AND !(d.date > NOW())

但它显示的事件既有过去日期也有未来日期。

示例数据

事件table

id_event
1
2

日期table

id_event date
1 2020-10-10
1 2030-10-10
2 2020-10-10

查询应该return只有一条记录,id_event = 2.

NOW()是时间戳:你想要CURDATE 尝试

SELECT e.id_event 
FROM events e RIGHT 
JOIN dates d 
ON e.id_event=d.id_event AND d.date <= CURDATE();

<= CURDATE() 是在今天之前或包括今天,这与 NOT IN THE FUTURE 是一回事。

有几种方法可以做到这一点

create table t1(id_event int, date date);

insert into t values (1),(2);
insert into t1 values (1,'2020-01-01'),(1,'2030-01-01'),(2,'2020-01-01');

SELECT e.id_event 
FROM t e 
left JOIN t1 d ON e.id_event=d.id_event 
group by e.ID_event having max(d.date) < now()
;

SELECT e.id_event 
FROM t e 
left JOIN t1 d ON e.id_event=d.id_event 
where not exists(select 1 from t1 t2 where t2.id_event = d.id_event and t2.date > now())
;

如果您打算从 table..

中获取更多列,则 First 可能没有用

您可以试试这个查询 (Demo):

SELECT evt.id_event
FROM events evt 
WHERE evt.id_event NOT IN (
  SELECT e.id_event 
  FROM events e 
  INNER JOIN dates d 
  ON e.id_event=d.id_event 
  AND d.date > CURDATE()
);

这里首先找出所有具有未来日期的事件id,然后选择之前找出的事件id中没有的事件id。