mysql - 多左连接的正确语法是什么?左表的条件是什么?

标签 mysql join where-clause

以下 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 表:

enter image description here

post_job_description 表:

enter image description here

employers_description 表:

enter image description here

最佳答案

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 .

您必须更改 id name = MaIT ar 的记录值来自 21 , 所以来自 employers_description 的两个语言版本LEFT JOIN 获取操作(如 post_job_description 表中的情况)。

作为旁注,也许您应该考虑规范化 post_job_descriptionemployers_description保持表格 language每个帖子和language每个员工的信息在单独的表中。

关于mysql - 多左连接的正确语法是什么?左表的条件是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31077506/

相关文章:

mysql - 在mysql中准备一条Prepare语句并在其中使用convert_tz

mysql - 这些 sql 连接之间的差异(相同的结果,相同的执行计划)

mysql - 一张表两个字段的内连接

MYSQL 在内连接中使用减法更新列

c# - 在 Linq 中发出对象 where 子句 : the condition is bypassed

java - 获取前几个月的第一个和最后一个日期

mysql - SQL 通过 COUNT() 列限制输出

mysql - 将值范围与另一个值范围进行比较 mysql

mysql - 选择每个客户的最后一个按时间顺序排列的记录,其中每个客户在多个日期都有许多记录

php - 当您有大量数据时,脚本功能会变慢