我有添加剂表:
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 = 195
在on
故意条款。这确保了 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/