最近、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を許してでもそのレコードを表示するかどうかというところが違いになります。
しっかり使い分けてコードを書けるようになっていきたいです。