【问题标题】:MySQL LEFT JOIN with optional value in second tableMySQL LEFT JOIN 在第二个表中具有可选值
【发布时间】: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

【问题讨论】:

  • 我认为您需要提供示例数据和预期输出来传达您的目标。

标签: mysql sql join


【解决方案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

    如果其条件匹配,则显示值,否则显示空值。

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2021-03-12
      • 2013-04-19
      • 2019-02-23
      • 2013-09-11
      相关资源
      最近更新 更多