2014-11-14 3 views
0

날짜에 대한 정보가 포함 된 달력을 가져올 SQL이 있습니다.행을 잃지 않고 사용자가 필터링하도록 SQL을 작성하는 방법은 무엇입니까?

SELECT h.user_id, name, description, name_day, h.holiday_id, day 
FROM calendar_dates d left join calendar_date_holiday h on d.id=h.date_id 
left join calendar_holidays hs on h.holiday_id=hs.id 
WHERE h.user_id IS NULL 
or h.user_id IN (SELECT id FROM calendar_users WHERE username='bd107a66ba') 
order by day asc 

다른 사용자에게 휴일 인 경우 holiday_id가없는 경우 작동합니다. 이제 조건 ('어디서 h.user_id IS NULL 또는 h.user_id IN (SELECT id FROM calendar_users WHERE username ='bd107a66ba ')`)보다 다른 user_id : s 인 휴가 ID에도 가입하고 싶습니다. 다른 사용자의 휴일을 원하지 않습니다. 그것을 어떻게 성취 할 수 있습니까? 예를 들어

어떤 사용자가 어떤 자신의 휴가가없는 경우는, 결과는 bd107a66ba 아닌 다른 사용자가 휴가를 삽입하면 그 가입하지 않기 때문에, 나는 만 29 행을 얻을

user_id name description name_day holiday_id day 
    NULL NULL NULL  Name  NULL  1 
... 

    (30 rows) 

좋다. 노동 조합을 사용해야합니까? 다른 사용자가 현재 사용자가 아닌 같은 날에 휴일이있는 경우 빈 휴일을 원합니다.

+2

실제로하려는 것을 더 잘 설명하기 위해 샘플 데이터와 원하는 결과를 제공 할 수 있습니까? –

+1

WHERE 절을 첫 번째 조인의 ON 절에 넣을 수 있습니다. – Kickstart

답변

1

달력 사용자 테이블에 여분의 조인을 추가하는 것이 가장 좋을 수도 있습니다 (아마도 체크 인 사용자 이름이 존재해야한다고 가정 할 때 INNER JOIN 일 것입니다). 그런 다음 calendar_date_holiday에 대한 조인에서 사용자 ID를 사용하십시오. -

SELECT h.user_id, name, description, name_day, h.holiday_id, day 
FROM calendar_dates d 
INNER JOIN calendar_users cu 
ON cu.username = 'bd107a66ba' 
LEFT JOIN calendar_date_holiday h 
ON d.id = h.date_id 
AND h.user_id = cu.id 
LEFT JOIN calendar_holidays hs 
ON h.holiday_id = hs.id 
ORDER BY day ASC 
관련 문제