多重左连接的正确语法是什么?左边的条件 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_description
table到post_job
table.
仅从 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_description
由 LEFT JOIN
操作获取(如 post_job_description
table 中的情况)。
作为旁注,也许您应该考虑通过保持 post 和 language
的 language
来规范化 post_job_description
和 employers_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
以下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_description
table到post_job
table.
仅从 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_description
由 LEFT JOIN
操作获取(如 post_job_description
table 中的情况)。
作为旁注,也许您应该考虑通过保持 post 和 language
的 language
来规范化 post_job_description
和 employers_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