我有一个"事件"表和" events_dates"表。 " events_dates"在" events"中引用了event_id。表。 我想构建一个存储函数,检查NOW()是否大于" events_dates"中的所有日期。引用特定的event_id。 我已经写了这个函数,以获得一个tinyint(1)值(如果为真则为1,如果为假则为0),但我总是假的。 而且,我觉得我迷路了。 你会在我的位置做什么?
我想在更大的查询中使用该函数,并使用它:
SELECT e.*, ed.*
FROM events e INNER JOIN
events_dates ed
ON e.event_id = ed.fk_event_id
WHERE IF (checkIfAllDatesArePassed(e.event_id),DATEDIFF(ed.event_date,NOW())<0,DATEDIFF(ed.event_date,NOW())>0)
实际上它有点复杂,但我相信你明白了这一点:)
谢谢大家。
答案 0 :(得分:0)
如果您只想要满足此条件的事件以及标志:
SELECT ed.event_id,
(max(event_date) < now()) as AllDatesPast
FROM events_dates ed
group by event_id;
如果您需要事件信息,请加入events
:
SELECT e.*
FROM events e join
events_dates ed
on e.event_id = ed.fk_event_id
group by e.event_id
having max(event_date) < now();
如果你想要日期:
SELECT e.*, ed.*
FROM events e join
events_dates ed
on e.event_id = ed.fk_event_id
WHERE not exists (select 1
from event_dates ed2
where e.event_id = ed2.event_id and
event_date > now()
) ;
答案 1 :(得分:0)
我会使用ALL关键字,例如
select *
from events
where now() > all (select event_date from events_dates where fk_event_id = event_id)
假设event_id是函数的参数。
但我无法理解checkIfAllDatesArePassed应该是什么。
从评论中更新:
drop function if exists checkIfAllDatesArePassed;
delimiter $$
create function checkIfAllDatesArePassed(event_id integer)
returns integer
language sql
begin
return select case
when now() > all (select event_date from events_dates where fk_event_id = event_id) then 1
else 0;
end;
$$
delimiter;
那会吗?