2014-02-05 60 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。 。 。查看編輯後的第一個查詢。 –

相關問題