プロパティテーブルが(g_addressesテーブルからの)アドレスIDを保持し、申請者テーブルまたがg_addressesからのアドレスIDを保持する状況があります。これらを一緒に左結合したいのですが、テーブル内のすべてのフィールドを選択します。
'as'を使用してフィールドのエイリアスを作成することは知っていますが、テーブル全体のエイリアスを作成する方法はありますか?
SELECT *
FROM (`reference`)
LEFT JOIN `applicants` ON `applicants`.`id` = `reference`.`applicant_id`
LEFT JOIN `g_people` applicant_person ON `applicant_person`.`id` = `applicants`.`person_id`
LEFT JOIN `g_addresses` applicant_address ON `applicant_address`.`id` = `applicants`.`address_id`
LEFT JOIN `properties` ON `properties`.`id` = `reference`.`property_id`
LEFT JOIN `g_addresses` property_address ON `property_address`.`id` = `properties`.`address_id`
WHERE `reference`.`id` = 4
これにより、両方ではなく1つのアドレス行のみを含む結果が生成されます。返される行は、最後の結合からの行であり、以前の行ではなく、返されるときに上書きされていることを示します。
*
や`reference`.*
のようなマスクされた参照を使用するべきではないと思います。同じ列名(id
、address_id
)を含む行セットになる可能性があるためです。
結合されたテーブルからすべての列をプルする場合は、SELECT句でそれらを個別に指定し、それらすべてに一意のエイリアスを割り当てる必要があります。
SELECT
ref.`id` AS ref_id,
ref.`…` AS …,
…
app.`id` AS app_id,
…
FROM `reference` AS ref
LEFT JOIN `applicants` AS app ON app.`id` = ref.`applicant_id`
LEFT JOIN `g_people` AS ape ON ape.`id` = app.`person_id`
LEFT JOIN `g_addresses` AS apa ON apa.`id` = app.`address_id`
LEFT JOIN `properties` AS pro ON pro.`id` = ref.`property_id`
LEFT JOIN `g_addresses` AS pra ON pra.`id` = pro.`address_id`
WHERE ref.`id` = 4
選択する列についてより具体的に
SELECT
applicant_address.*,
property_address.*,
applicants.*,
applicant_person.*,
properties.*
FROM (`reference`)
LEFT JOIN `applicants` ON `applicants`.`id` = `reference`.`applicant_id`
LEFT JOIN `g_people` applicant_person ON `applicant_person`.`id` = `applicants`.`person_id`
LEFT JOIN `g_addresses` applicant_address ON `applicant_address`.`id` = `applicants`.`address_id`
LEFT JOIN `properties` ON `properties`.`id` = `reference`.`property_id`
LEFT JOIN `g_addresses` property_address ON `property_address`.`id` = `properties`.`address_id`
WHERE `reference`.`id` = 4