SQL查询在左联接中为空
我有一个表,其中包含我网站上帐户的信息。可以在不同的页面(例如搜索页面和frontpage)上升级个人资料,直到过期日期 促销存储在表profile\u promo中,并由profile\u id连接 我的问题是,在搜索页面上,我想显示所有配置文件,并与促销表左连接SQL查询在左联接中为空,sql,Sql,我有一个表,其中包含我网站上帐户的信息。可以在不同的页面(例如搜索页面和frontpage)上升级个人资料,直到过期日期 促销存储在表profile\u promo中,并由profile\u id连接 我的问题是,在搜索页面上,我想显示所有配置文件,并与促销表左连接 LEFT JOIN profile_promotion pp ON pp.profile_id = profile.id WHERE (pp.page = 'search' OR pp.page is NULL) and pp.e
LEFT JOIN profile_promotion pp ON pp.profile_id = profile.id
WHERE (pp.page = 'search' OR pp.page is NULL) and pp.expire >= now()
只要搜索页面上有促销,或者根本没有促销,这种方法就行
如果frontpage上只有一个促销,我的搜索页面就不会有任何结果,因为WHERE
但我仍然希望从个人资料中获得信息,无论是否有促销活动。
值得注意的是,一个概要文件可以同时在多个页面上进行升级(这可能会改变一些逻辑)
我不擅长SQL,那么如何解决这个问题呢?使用带有左连接的where子句最终将其转换为内部连接。你需要根据需要调整你的条件-
LEFT JOIN profile_promotion pp ON pp.profile_id = profile.id
AND (pp.page = 'search' OR pp.page is NULL)
AND pp.expire >= now()
正如您现在所知,匹配未过期促销的正确逻辑是:
FROM profile p LEFT JOIN
profile_promotion pp
ON pp.profile_id = p.id AND
pp.page = 'search' AND
pp.expire >= now()
LEFT JOIN
的逻辑是返回第一个表中的所有行,即使ON
条件的计算结果为NULL
因此,第二个表上的过滤条件应该在on
子句中。仅第一个表上的筛选条件应位于WHERE
子句中
您的代码:
FROM profile p LEFT JOIN
profile_promotion pp
ON pp.profile_id = p.id AND
WHERE (pp.page = 'search' OR pp.page is NULL) AND
pp.expire >= now()
由于第二个条件,将其转换为内部联接。当LEFT JOIN
未找到匹配项时,则pp.expire
将NULL
并使条件失败
您可以尝试通过以下方式来解决此问题:
WHERE (pp.page = 'search' OR pp.page is NULL) AND
(pp.expire >= now() OR pp.expire IS NULL)
然而,这仍然不是相同的逻辑。当
pp
中根本没有匹配项时,将捕获此消息。但是,当存在匹配项时,它不会执行您想要的操作,但对于搜索
而言,它不会将WHERE子句的条件移动到ON子句。这就成功了,谢谢,谢谢,它起作用了。但看起来我不需要“或pp.page为空”:)您可以删除该条件。