3

我有添加剂表:

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)

4

3 回答 3

10

您缺少以下条件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,在两个表之间执行 a 并仅获取与on条件匹配的行(left join同时保留第一个表中的所有行)。由于没有on条件,连接将保留两个表中的所有行对,其中sa.stage_id = 195- 这是很多对。

编辑:

(响应将条件sa.stage_id = 195移入where子句。)

条件sa.stage_id = 195是故意在on条款中的。这确保了left join实际行为如所写。如果将条件移到where子句中,则 theleft join将变为inner join. additive没有匹配的行将stage_additive具有NULLsa.stage_id并被过滤掉。我必须假设 OP 打算left join保留所有行,additive因为left join.

于 2013-08-03T14:11:07.757 回答
1

in 子句ON应该是表之间的关系和 stage_id in 的条件WHERE

于 2013-08-03T14:10:52.973 回答
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在这种情况下,您可以使用代替 a 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

于 2013-08-03T14:13:57.937 回答