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

同じID/名前のアイテムが各テーブルごとに1つしかないにもかかわらず、結果に各アイテムが3つあるため、これは私には意味がありません。

内部結合、右結合も試しましたが、結果は順序を除いてほぼ同じです。

私が欲しいのは、すべての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概念的には 2 つのテーブル間で を実行し、条件cross joinに一致する行のみを取得していることに注意してください (は、最初のテーブルのすべての行も保持しています)。条件を持たないことで、結合は 2 つのテーブルの行のすべてのペアを保持します。これは多くのペアです。onleft joinonsa.stage_id = 195

編集:

sa.stage_id = 195(条件をwhere句に移動することに応じて。)

条件sa.stage_id = 195onわざと節に入れています。これにより、 がleft join実際に記述どおりに動作することが保証されます。条件がwhere節に移動された場合、left joinは に変わりinner joinます。additive一致しない行にstage_additiveNULL値がsa.stage_idあり、フィルターで除外されます。を明示的に使用しているため、OPはleft joinすべての行を保持することを意図していたと想定する必要があります。additiveleft join

于 2013-08-03T14:11:07.757 に答える
1

in 句ONは、テーブル間の関係と stage_id in の条件である必要がありますWHERE

于 2013-08-03T14:10:52.973 に答える