我有两个表:projects
和user_licenses
。
我想从数据库中获取整个项目列表,以及用户当前的许可证状态。许可证表有一个用户ID字段,我根据$_SESSION
变量检查该值。问题是,他们可能没有许可证,或者未登录的访问者可能希望查看项目列表。我的问题是:如何从左表总是显示数据,但只有在满足某些条件时才从右表中获取该行的数据?
我目前的查询是:
SELECT Projects.*,
UserLicenses.*
FROM Projects
LEFT JOIN UserLicenses ON Projects.id = UserLicenses.project_id
WHERE UserLicenses.user_id = 12
ORDER BY name ASC
答案 0 :(得分:39)
向左连接的on
子句添加任何额外条件。它们只会影响连接表。
SELECT Projects.*,
UserLicenses.*
FROM Projects
LEFT JOIN UserLicenses
ON Projects.id = UserLicenses.project_id
and UserLicenses.user_id = 12
and UserLicences.Question = '6*7'
and UserLicences.Answer = 42
ORDER BY name ASC
这将返回没有匹配许可证的项目。
答案 1 :(得分:3)
将UserLicenses条件从WHERE移开,直到JOIN条件。通过将它放在WHERE部分中,您将永远不会看到那些“左”行,因为它们被过滤掉了。
您也可以使用
不要那样做。只需将其移动到连接条件,如下所示:WHERE (UserLicenses.user_id = 12 OR UserLicenses.user_id IS NULL)
LEFT JOIN UserLicenses ON
(Projects.id = UserLicenses.project_id AND UserLicenses.user_id = 12)
答案 2 :(得分:0)
您可以使用LEFT JOIN
如果条件匹配,则值显示否则显示空值。