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

时间:2011-03-12 19:34:05

标签: mysql sql join

我有两个表:projectsuser_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

3 个答案:

答案 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

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