【问题标题】:Mysql - How to alias a whole table in a left joinMysql - 如何在左连接中为整个表起别名
【发布时间】:2011-11-01 06:54:34
【问题描述】:

我有一种情况,属性表包含地址 ID(来自 g_addresses 表),而申请人表包含来自 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 

这会产生一个只包含一个地址行而不是两个地址行的结果, 返回的行是来自最终连接的行,而不是之前的行,表明它在返回时被覆盖。

【问题讨论】:

    标签: mysql sql join alias


    【解决方案1】:

    我认为您不应该使用掩码引用,例如 *`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
    

    【讨论】:

    • 谢谢,我用这个作为我的最终解决方案!
    【解决方案2】:

    更具体地了解您选择的列

    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 
    

    【讨论】:

    • 我想从每个表中选择每一列 - 听起来可能有点矫枉过正,但在这种情况下这是必要的!换句话说 - 有什么方法可以在不输入每个列名的情况下做到这一点?总共大约有85个。感谢您的快速反馈。
    • @Anthony 见上文,为每个表别名使用tablename.*
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多