复杂JOIN查询JOIN表可能没有记录

时间:2013-10-23 14:50:46

标签: mysql

我有两个表,一个称为“用户”,另一个称为“项目”。我希望从用户那里编译一个ID列表,其中字段users.eventdate在3天之内。为了使事情变得更复杂,我还想看看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 个答案:

答案 0 :(得分: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,您将返回第一个表格中的所有行(“左侧”),并根据该键加入另一个表,该键可能与“右侧”匹配,也可能不匹配侧。