Mysql - Как создать псевдоним всей таблицы в левом соединении - PullRequest
8 голосов
/ 22 августа 2011

У меня есть ситуация, когда таблица свойств содержит идентификатор адреса (из таблицы g_addresses), а таблица заявителя также содержит идентификатор адреса из g_addresses.Я хотел бы объединить их слева, но выберите все поля в таблице.

Я знаю, как использовать '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 

Это приводит к результату, содержащему только одну строку адреса, а не обе. Возвращаемая строка является строкой из последнего соединения, а не той, что была ранее, указывая, что она перезаписывается при возврате.

Ответы [ 2 ]

14 голосов
/ 23 августа 2011

Я не думаю, что вы должны использовать маскированные ссылки, такие как * или `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
1 голос
/ 22 августа 2011

Более конкретно о выбранных вами столбцах

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 
...