SQL查询在左联接中为空

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

我有一个表,其中包含我网站上帐户的信息。可以在不同的页面(例如搜索页面和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.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为空”:)您可以删除该条件。