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。
有 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。