【问题标题】:What is the proper syntax for multiple left join and where condition on the left table?多重左连接的正确语法是什么?左表上的条件是什么?
【发布时间】:2015-09-13 15:54:48
【问题描述】:

下面的select语句返回零结果,为什么?

SELECT `post_job`.`id`,
    `post_job_description`.`title`,
    `employers_description`.`name`
FROM (`post_job`)
LEFT JOIN `post_job_description`
    ON `post_job`.`id` = `post_job_description`.`post_job_id`
LEFT JOIN `employers_description`
    ON `post_job`.`employers_id` = `employers_description`.`id`
WHERE `post_job`.`published` = 1
    AND `post_job_description`.`language` IN ('en')
    AND `employers_description`.`language` IN ('en')
    AND `post_job`.`deleted` = 0
GROUP BY `post_job_description`.`post_job_id`
LIMIT 25

当我删除它时:

AND `employers_description`.`language` IN ('en')

它返回数据但employers_description.name 的值不是英文

post_job 表:

post_job_description 表:

employers_description 表:

【问题讨论】:

    标签: mysql join where


    【解决方案1】:

    这个ON 子句:

    `post_job`.`employers_id` = `employers_description`.`id`
    

    用于将employers_description 表连接到post_job 表。

    从post_job 表中选择了单行(根据您发布的示例数据):

    id employers_id published deleted
    ---------------------------------
    1  2            1         0
    

    根据上面提到的ON 子句,employers_description 中的以下一行是由LEFT JOIN 获取的:

    name    id language
    -----------------
    MaIT ar 2  ar
    

    因此,这个谓词:

    `employers_description`.`language` IN ('en')
    

    过滤掉这一行,你不会得到任何结果。如果将此谓词从WHERE 子句中取出,则会返回此行,但是,正如您从上面看到的,language = ar。

    您必须将带有name = MaIT ar 的记录的id 值从2 更改为1,以便employers_description 中的两个语言版本都被LEFT JOIN 获取操作(如post_job_description 表中的情况)。

    作为旁注,也许您应该考虑规范化 post_job_description 和 employers_description 表,方法是将每个帖子的 language 和每个员工信息的 language 保存在单独的表中。

    【讨论】:

      【解决方案2】:

      您使用LEFT JOIN 加入的表上的任何条件都必须放入ON 子句中。如果你把它放在WHERE 子句中,不匹配的行返回的空值将不匹配这个条件,它们会将整行过滤掉。

      此外,您的 GROUP BY 列应该来自主表,而不是 LEFT JOIN 表之一。否则,所有匹配为空的行将被组合在一起。

      所以改成

      SELECT `post_job`.`id`,
          `post_job_description`.`title`,
          `employers_description`.`name`
      FROM (`post_job`)
      LEFT JOIN `post_job_description`
          ON `post_job`.`id` = `post_job_description`.`post_job_id`
              AND `post_job_description`.`language` IN ('en')
      LEFT JOIN `employers_description`
          ON `post_job`.`employers_id` = `employers_description`.`id`
              AND `employers_description`.`language` IN ('en')
      WHERE `post_job`.`published` = 1
          AND `post_job`.`deleted` = 0
      GROUP BY `post_job`.`post_job_id`
      LIMIT 25
      

      【讨论】:

        猜你喜欢
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        相关资源
        最近更新 更多