2013-10-23 3 views
0

"사용자"라는 테이블과 "항목"이라는 테이블이 두 개 있습니다. users.eventdate 필드가 현재 3 일 이내에있는 사용자의 ID 목록을 컴파일하려고합니다. 물건을 더 복잡하게 만들려면 items.startingdate가 지금부터 3 일 이내에 있는지 확인해야합니다.복잡한 조인 쿼리 조인 테이블에 레코드가 없을 수도 있습니다.

따라서 users.eventdate가 지금부터 3 일 이내이거나 3 일 이내에 item.startdate가있는 경우 users.ID를 반환하십시오. 사용자와 항목 간의 관계는 users.ggProjectId 및 items.uID입니다.

내가 현재 가지고 :

$strSQL = "SELECT users.ID, users.ggProjectId, users.timezone, users.ggTimestamp, users.slug, items.uID 
     FROM items 
     JOIN users ON users.ggProjectId = items.uID 
     WHERE (users.eventdate <= DATE(NOW() + INTERVAL 2 DAY) 
     AND users.eventdate >= DATE(NOW() - INTERVAL 2 DAY)) OR 
     (items.startingtime <= DATE(NOW() + INTERVAL 2 DAY) 
     AND items.startingtime >= DATE(NOW() - INTERVAL 2 DAY)) 
     GROUP BY users.ggProjectId"; 

문제는 사용자 기록에 대한 항목이없는 경우 다음 나는 EVENTDATE이 시간 내에 때문에 나는 그것을 필요로하더라도 결과로 그를 얻을 수 없다는 것입니다 틀. 나는 그것을 죽이는 것이라고 생각합니다. 데이터가 당신이 가입 할 테이블에 존재하지 않을 경우

답변

1

는, 당신은 LEFT JOIN 사용하려면 : LEFT JOIN

SELECT 
    users.ID 
    ,users.ggProjectId 
    ,users.timezone 
    ,users.ggTimestamp 
    ,users.slug 
    ,items.uID 
FROM users 
LEFT JOIN items 
ON users.ggProjectId = items.uID 
WHERE 
    (
     users.eventdate <= DATE(NOW() + INTERVAL 2 DAY) 
    AND users.eventdate >= DATE(NOW() - INTERVAL 2 DAY) 
    ) OR ( 
     items.startingtime <= DATE(NOW() + INTERVAL 2 DAY) 
    AND items.startingtime >= DATE(NOW() - INTERVAL 2 DAY) 
    ) 
GROUP BY users.ggProjectId 

, 당신은 첫 번째 테이블의 모든 행을 반환합니다 (이하 "왼쪽 "측면), 그리고"오른쪽 "측면에서 일치하는 키를 기반으로 다른 테이블에 가입 할 수 있습니다.

+0

감사합니다. 이것은 잘 돌아갔다. –

관련 문제