2014-02-05 4 views
0

"events"테이블과 "events_dates"테이블이 있습니다. "events_dates"에 "events"테이블의 event_id에 대한 참조가 있습니다. NOW()가 특정 event_id를 참조하는 "events_dates"의 모든 날짜 중 더 큰지 확인하는 저장 함수를 작성하려고합니다. tinyint (1) 값 (true 인 경우 1, 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

@Aptivus. . . 편집 된 첫 번째 쿼리를 참조하십시오. –