Posted on

INNER JOIN と LEFT JOIN の違い

最近、CakePHPを書く仕事でjoinを使うことが多くなりました。でも、joinにも種類があって、inner join と left join をよく使っていますが、仕事始めたての頃はその違いを認識できていませんでした。最近になってようやくその違いがわかり、その重要性もある程度分かるようになってきました。今回はそのことの復習の意味もこめて、2種類のjoinについてまとめておきたいと思います。

[Main]
------------------------
id     color    user_id
------------------------
1      red      001
2      green    002
3      blue     003
4      white    004
5      black    005
------------------------

[User]
--------------
id     name
--------------
001    taro
002    jiro
003    saburo
--------------

データベースが上記MainとUserの2つがあり、これらをinner join 、left joinで結合するときのコードと結果はそれぞれ以下になります。

○inner joinの場合

$params = array(
            'fields' => array(
                'Main.id',
                'Main.color',
                'User.name',
            ),
            'joins' => array(
                array(
                    'type' => 'inner',
                    'table' => 'users',
                    'alias' => 'User',
                    'conditions' => 'Main.user_id = User.id'
                ),
            ),
        );
$result = $this->find('all', $params);
 【 結果 】
------------------------------
Main.id  Main.color  User.name
------------------------------
1        red         taro
2        green       jiro
3        blue        saburo
------------------------------

○left joinの場合

$params = array(
            'fields' => array(
                'Main.id',
                'Main.color',
                'User.name',
            ),
            'joins' => array(
                array(
                    'type' => 'left',
                    'table' => 'users',
                    'alias' => 'User',
                    'conditions' => 'Main.user_id = User.id'
                ),
            ),
        );
$result = $this->find('all', $params);
【 結果 】
------------------------------
Main.id  Main.color  User.name
------------------------------
1        red         taro
2        green       jiro
3        blue        saburo
4        white       NULL
5        black       NULL
------------------------------

NULLを許してでもそのレコードを表示するかどうかというところが違いになります。
しっかり使い分けてコードを書けるようになっていきたいです。