二重のLEFT JOIN

DB

  • user::社員
    • id::社員ID
    • name::社員名
  • project::案件
    • id::案件ID
    • name::案件名
    • id__customer_user__agency::代理店(取引先)社員ID
    • id__customer_user__client::クライアント(取引先)社員ID
    • id__user__main_director::メインディレクター(社員)ID
  • customer_user::取引先社員
    • id::取引先社員ID
    • id__customer::所属取引先ID
    • name::取引先社員名
  • customer::取引先
    • id::取引先ID
    • name::取引先名

※代理店とクライアントは別け隔てなく、同一のテーブルで管理
※プロジェクトには必ずクライアントが存在する
※プロジェクトによっては代理店がある場合も、ない場合もある

SQL

SELECT
project.*,
user.name            AS name__user__director,
customer_user_B.name AS name__customer_user__client,
customer_B.name      AS name__customer__client,
customer_user_A.name AS name__customer_user__agency,
customer_A.nameAS name__customer__agency
FROM project LEFT JOIN customer_user AS customer_user_A ON project.id__customer_user__agency = customer_user_A.id
             LEFT JOIN customer      AS customer_A      ON customer_user_A.id__customer      = customer_A.id,
user, customer_user AS customer_user_B, customer AS customer_B
WHERE project.id__user__main_director    = user.id
AND   customer_user_B.id__customer       = customer_B.id
AND   project.id__customer_user__client  = customer_user_B.id

customerテーブルとcustomer_userテーブルを、それぞれLEFT JOINとWHERE内で使用しているが、前者を「*_A」、後者を「*_B」とASで名前を変更している。

  • *_A
    • id__customer_user__agency側の条件クエリ
      • ない場合もあるのでLEFT JOIN
  • *_B
    • id__customer_user__client側の条件クエリ
      • 必須なのでWHERE句