5

假设我有两个表,它们的主要标识符都使用名称“id”。如果我想对这两个表执行连接,我将如何id为要与前一个表连接的表的别名?

例如:

SELECT * FROM `sites_indexed` LEFT JOIN `individual_data` ON `sites_indexed`.`id` = `individual_data`.`site_id` WHERE `url` LIKE :url

现在,site_id 应该与sites_indexed.id. id然而,代表该行的实际individual_data具有与 相同的标题sites_indexed

就个人而言,我喜欢只id为所有内容使用名称,因为它可以保持一致。但是,在编写服务器端脚本时,它可能会使事情变得混乱。

例如

$var = $result['id'];

鉴于上述查询,这不会使解释器感到困惑吗?

无论如何,这是如何实现的?

4

4 回答 4

11

您应该明确命名所需的每个字段,而不是使用“SELECT *”选择所有字段,并根据需要使用 AS 为它们起别名。例如:

SELECT si.field1 as si_field1,
       si.field2 as si_field2,
       ind_data.field1 as ind_data_field1
  FROM sites_indexed as si
  LEFT JOIN individual_data as ind_data 
         ON si.id = ind_data.site_id 
 WHERE `url` LIKE :url

然后您可以在结果集中引用别名。

于 2012-08-15T22:18:51.493 回答
5

这个线程很旧,我发现因为我有同样的问题。现在我有一个更好的解决方案。Paul McNett 和 antun 给出的答案迫使您列出所有字段,但在某些情况下这是不可能的(列出的字段太多),因此您可以只保留您想要的字段 * 和别名(通常是具有相同的字段名称并将相互覆盖)。

就是这样 :

    SELECT *, t.myfield as myNewName 
FROM table t ... continue your query

您可以通过添加逗号来添加任意数量的别名。

于 2014-09-30T22:40:30.603 回答
3

使用此表达式,您将获得包含id列(来自表sites_indexed)和id2 (来自表individual_data的列id的别名)的结果

SELECT t1 . *, t2 . * FROM sites_indexed t1
LEFT JOIN (select id as id2, other_field1, other_field2 FROM individual_data) t2 ON t1.id = t2.site_id WHERE your_statement
于 2016-06-15T08:41:42.073 回答
2

问题是您使用的是 * 通配符。如果您在查询中明确列出列名,则可以给它们起别名:

SELECT `sites_indexed`.`id` AS `sites_indexed_id`,
       `individual_data`.`id` AS `individual_data_id`
       FROM `sites_indexed` 
       LEFT JOIN `individual_data` ON `sites_indexed`.`id` = `individual_data`.`site_id` 
       WHERE `url` LIKE :url

然后您可以通过别名引用它们:

$var = $result['sites_indexed_id']; $var_b = $result['individual_data_id'];

于 2012-08-15T22:28:48.577 回答