mysql - Left Join 查询返回重复项

标签 mysql sql left-join

我有添加剂表:

id   name
30   gro
31   micro
32   bloom
33   test

和 stage_additives 表:

stage_id  additive_id   dose
195       30            2
195       31            3
195       32            1

Mysql查询:

SELECT a.id,
       a.name,
       sa.dose
FROM   additives a
LEFT JOIN stage_additives sa
ON     sa.stage_id = 195

结果是:

id name  dose
32 Bloom 2
32 Bloom 3
32 Bloom 1
30 Gro 2
30 Gro 3
30 Gro 1
31 Micro 2
31 Micro 3
31 Micro 1
33 test 2
33 test 3
33 test 1

这对我来说没有意义,因为结果中每个项目都有 3 个,即使每个表只有一个具有相同 ID/名称的项目。

我也尝试了内连接、右连接但结果几乎相同,除了顺序。

我想要的是所有 id、来自添加剂的名称和来自 stage_additives 的剂量(如果它存在)否则为 NULL(或者更好的自定义值为 0)

最佳答案

您缺少 left join 中的条件:

SELECT a.id,
       a.name,
       sa.dose
FROM   additives a
LEFT JOIN stage_additives sa
ON     a.id = sa.additive_id and sa.stage_id = 195;

请记住,join在概念上做一个 cross join在两个表之间,只取与 on 匹配的行条件(left join 也保留第一个表中的所有行)。通过没有 on条件,连接将保留两个表中的所有行对,其中 sa.stage_id = 195 -- 这是很多对。

编辑:

(作为对将条件 sa.stage_id = 195 移动到 where 子句的回应。)

条件sa.stage_id = 195on故意条款。这确保了 left join实际上表现得像写的那样。如果条件移动到 where子句,然后是 left join会变成 inner join .来自 additive 的行在 stage_additive 中没有匹配项会有一个 NULL sa.stage_id 的值并被过滤掉。我必须假设 OP 用于 left join将所有行保留在 additive 中因为显式使用了 left join .

关于mysql - Left Join 查询返回重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18033683/

相关文章:

mysql - 尝试在 mysql 中运行更新查询时出现语法错误

sql - Oracle SQL 在包含数据时将列类型从 number 更改为 varchar2

mysql - 使用 WHERE IN 子句检查值是否不存在 - MYSQL

Mysql 带有 OR 条件的内连接 - 查询优化

mysql - 经过一些计算后,如何在一个表中显示多行,在另一个表中显示一行

MySQL Left Outer Join with Absence 条件

database-design - 创建物化 View 或新表哪个更好?

python - 合并相同的数据框,以便将每一行与其他每一行进行比较

php - SQL 订单子(monad)查询返回 fatal error

php - 如何在php中自动增加一个值?