我有添加剂表:
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)
答案 0 :(得分:8)
您错过了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
的{{1}}值被过滤掉。由于sa.stage_id
的明确使用,我必须假设left join
的OP旨在将所有行保留在additive
中。
答案 1 :(得分:1)
ON
中的应该是WHERE
答案 2 :(得分:0)
你可能想要像
这样的东西SELECT a.id,
a.name,
sa.dose
FROM additives a
LEFT JOIN stage_additives sa
ON sa.additive_id = a.id
WHERE sa.stage_id = 195
SQLFiddle:http://sqlfiddle.com/#!2/fd607/4
在这种情况下,您可以使用LEFT JOIN
代替INNER JOIN
,因为WHERE
子句基于联接的成功。
SELECT a.id,
a.name,
sa.dose
FROM additives a
INNER JOIN stage_additives sa
ON sa.additive_id = a.id AND sa.stage_id = 195
SQLFiddle:http://sqlfiddle.com/#!2/fd607/8
但也许你真的想要一个LEFT JOIN
:
SELECT a.id,
a.name,
sa.dose
FROM additives a
LEFT JOIN stage_additives sa
ON sa.additive_id = a.id AND sa.stage_id = 195
这将返回第四行:
33 test (null)
SQLFiddle:http://sqlfiddle.com/#!2/fd607/7