web-dev-qa-db-ja.com

Mysql-左結合でテーブル全体をエイリアスする方法

プロパティテーブルが(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つのアドレス行のみを含む結果が生成されます。返される行は、最後の結合からの行であり、以前の行ではなく、返されるときに上書きされていることを示します。

9
Anthony

*`reference`.*のようなマスクされた参照を使用するべきではないと思います。同じ列名(idaddress_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
15
Andriy M

選択する列についてより具体的に

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 
1