左外部結合?内部結合?

外部結合で複数のテーブルを結合してデータを取得させる方法が腑に落ちないため、今回はLEFT OUTER JOINさん特集の会にしております。

それでは、主役のLEFT OUTER JOINさんのプロフィールをご覧ください。

書き方

下記のように、モデル名と関連名をleft_joinsを使って関連づける

# ActiveRecordにおける左外部結合の基本形
モデル名.left_joins(:関連名)

そもそも左外部結合とは

結合したテーブル内のカラムを関連の有無関係なしに取得する指令

もっと簡単に言うと左側のテーブルを基準に結合すること。

  • モデル名を親テーブルとして、左に関連名テーブルをくっつけた状態で、モデル名のデータをとってくる。
  • ActiveRecordが勝手にモデル名テーブルと関連名テーブルの共通するidでくっつけてくれる。
SELECT  `モデル名`.* 
FROM `モデル名` 
LEFT OUTER JOIN `関連名` 
ON `関連名`.`モデル名_id` = `関連名`.`id` 
LIMIT 〇〇

left_joinsメソッドの引数には、アソシエーションで定義した関連名を指定する。

例えば犬を飼っている飼い主テーブルとその飼い主に飼われている犬テーブルを書いてみる。

# owner.rb
class Owner < ApplicationRecord
    has_many :dogs # 関連名
end

# dog.rb
class Dog < ApplicationRecord
    belongs_to :owner # 関連名
end

整理しておきたい「外部結合」と「内部結合」

内部結合:

  • 2つのテーブルをくっつけて1つのテーブルっぽくする際のやり方のひとつ。
  • 両方のテーブルの合体可能なデータのみを取り出すやり方

外部結合:

  • 2つのテーブルをくっつけて1つのテーブルっぽくする際のやり方のひとつ。
  • 基準となるテーブルにデータがあれば、もう一方のテーブルになくても取り出すやり方。
  • 左のテーブルにしかデータがない場合は、結合先のレコードにNULLが入る

https://wa3.i-3-i.info/diff294db.html

どんな風に使うのか

条件を指定したい場合(モデル名に条件をつける時)

モデル名.left_joins(:関連名).where(カラム名: 値)

条件を指定したい場合(関連名に条件をつける時)

モデル名.left_joins(:関連名).where(結合先のテーブル名: { カラム名: 値 })

なんとなく理解できてきました、、!

「内部結合(INNER JOIN)」と「外部結合(OUTER JOIN)」の違い|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

left_joinsメソッドで定義する左外部結合とは?