二重の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
- id__customer_user__agency側の条件クエリ
- *_B
- id__customer_user__client側の条件クエリ
- 必須なのでWHERE句
- id__customer_user__client側の条件クエリ