2013-10-23 66 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

谢谢。这很好。 –