2012-08-15 85 views
2

假设我有两个表,并且它们的主标识符都使用名称'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'];

鉴于上述查询,就不会混淆这解释?

无论如何,这是如何完成的?

回答

6

除了选择带有“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 

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

1

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

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 = $结果[“sites_indexed_id”]; $ var_b = $ result ['individual_data_id'];

4

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

方法如下:

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

你可以根据需要通过添加昏迷添加尽可能多的别名。

1

使用这种表达,你会得到与列结果ID(从表sites_indexed)和ID2(别名从表individual_dataID

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