我有两个表,一个称为“用户”,另一个称为“项目”。我希望从用户那里编译一个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属于时间范围。我认为正是这种情况正在扼杀它。
答案 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
,您将返回第一个表格中的所有行(“左侧”),并根据该键加入另一个表,该键可能与“右侧”匹配,也可能不匹配侧。