2013-10-23 63 views
0

我有兩個表,一個叫「用戶」,一個叫「項目」。我正在尋找來自users.eventdate字段在3天之內的用戶的ID列表。爲了讓事情更加複雜,我還希望看看items.startingdate是否在3天之內。複雜JOIN查詢在哪裏JOIN表可能沒有記錄

因此,如果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下降的時間內幀。我認爲這是殺死它的JOIN。

回答

1

如果數據可能不會在你想加入該表存在,那麼你要使用一個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 

隨着LEFT JOIN,你將返回在第一個表中的所有行(「左「側),並根據密鑰加入另一個表格,在」右側「可能有匹配或不匹配。

+0

謝謝。這很好。 –