多重左连接的正确语法是什么?左边的条件 table 是什么?

What is the proper syntax for multiple left join and where condition on the left table?

以下select语句return的结果为零,为什么?

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')

它是 return 数据,但是 employers_description.name 的值不是 English

post_job table:

post_job_描述table:

employers_description table:

这个ON子句:

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

用于连接employers_descriptiontable到post_jobtable.

仅从 post_job table 中选择了 单个 行(根据您的 posted 样本数据):

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

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

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

因此,这个谓词:

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

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

您必须将 name = MaIT ar 记录的 id 值从 2 更改为 1,这样 语言版本 来自 employers_descriptionLEFT JOIN 操作获取(如 post_job_description table 中的情况)。

作为旁注,也许您应该考虑通过保持 post 和 languagelanguage 来规范化 post_job_descriptionemployers_description tables ] 每个员工的信息单独 tables.

您要加入 LEFT JOIN 的 table 的任何条件都必须放入 ON 子句中。如果将它放在 WHERE 子句中,则为没有匹配项的行返回的空值将不匹配此条件,它们将过滤掉整行。

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

所以改成

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