MySQL LEFT JOIN 在第二个表中具有可选值

Posted

技术标签:

【中文标题】MySQL LEFT JOIN 在第二个表中具有可选值【英文标题】:MySQL LEFT JOIN with optional value in second table 【发布时间】:2011-07-14 04:25:46 【问题描述】:

我有两张桌子:projectsuser_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 在第二个表中具有可选值的主要内容,如果未能解决你的问题,请参考以下文章

SQL LEFT JOIN 从第二个表中排除两条记录

LEFT JOIN 两个 MySql 表,而第二个表按 desc 排序并限制为 1

如果一个表的列等于第二个表中的列,则在第三个表中插入值,python - mysql

LEFT JOIN,如果存在第二个表的结果,则添加到 PHP 中的数组

在第二个表 MySQL 上按顺序加入 2 个表时的索引

MySQL JOIN 2 个表并分别获取两个表的总和