MySQL LEFT JOIN 在第二个表中具有可选值
Posted
技术标签:
【中文标题】MySQL LEFT JOIN 在第二个表中具有可选值【英文标题】:MySQL LEFT JOIN with optional value in second table 【发布时间】:2011-07-14 04:25:46 【问题描述】:我有两张桌子:projects
和 user_licenses
。
我想从数据库中获取整个项目列表,以及用户当前的许可证状态。 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
【问题讨论】:
我认为您需要提供示例数据和预期输出来传达您的目标。 【参考方案1】:向左连接的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
这将返回没有匹配许可证的项目。
【讨论】:
谢谢!所以关键是使用 ON 而不是 WHERE。我被困了一段时间,直到我找到了这个。 因为你,我想去编辑十几个查询。【参考方案2】:将 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)
【讨论】:
【参考方案3】:您可以使用LEFT JOIN
如果其条件匹配,则显示值,否则显示空值。
【讨论】:
以上是关于MySQL LEFT JOIN 在第二个表中具有可选值的主要内容,如果未能解决你的问题,请参考以下文章
LEFT JOIN 两个 MySql 表,而第二个表按 desc 排序并限制为 1
如果一个表的列等于第二个表中的列,则在第三个表中插入值,python - mysql