0

我有两张表,一张称为“用户”,一张称为“项目”。我希望从现在 3 天内字段 users.eventdate 的用户那里编译一个 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 在时间范围内。我认为是 JOIN 杀死了它。

4

1 回答 1

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,您将返回第一个表(“左”侧)中的所有行,并根据键连接另一个表,该键在“右”侧可能匹配也可能不匹配。

于 2013-10-23T14:58:03.753 回答