2014-02-05 28 views
0

我有一个“events”表和一个“events_dates”表。 “events_dates”在“events”表中具有对event_id的引用。 我想建立一个存储函数,检查NOW()是否大于所有在“events_dates”中引用特定event_id的日期。 我已经写了该函数以获取tinyint(1)值(如果为true,则为0,如果为false,则为0),但始终为false。另外,我觉得我迷路了。 你会在我的地方做什么?检查一组日期是否小于NOW() - mysql

我想使用这个函数在一个更大的查询和使用它像:

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

我会使用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; 

请问这怎么办?

+0

checkIfAllDatesArePassed是我正在尝试构建的函数:)如果所有日期都小于NOW(),则该函数必须返回1,如果至少有一个日期大于NOW(),则该函数返回0。 – Aptivus

+0

....是的,event_id是我的函数的参数 – Aptivus

+0

那么请尝试ALL http://dev.mysql.com/doc/refman/5.5/en/all-subqueries.html关键字,毕竟它存在为此目的:) – codeblur

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() 
       ) ; 
+0

感谢您的解决方案。我只需要函数返回1或0.请检查我的评论@codeblur解决方案。谢谢 – Aptivus

+0

@Ativtiv。 。 。查看编辑后的第一个查询。 –

相关问题