假设我有两个表,并且它们的主要标识符都使用名称“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
来保持一致。然而,当编写服务器端脚本时,它会让事情变得混乱。
e.g。
$var = $result['id'];
鉴于上述查询,这不会使解释器混淆吗?
无论如何,这是如何实现的?
答案 0 :(得分:7)
您应该明确命名所需的每个字段,而不是使用“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 :(得分:4)
这个帖子很旧,我发现因为我有同样的问题。现在我有了更好的解决方案。 Paul McNett和antun给出的答案强制您列出所有字段,但在某些情况下这是不可能的(要列出的字段太多),因此您可以保留*和别名仅包含您想要的字段(通常是具有相同字段的字段)名称并将相互覆盖)。
以下是:
SELECT *, t.myfield as myNewName
FROM table t ... continue your query
您可以通过添加逗号来添加任意数量的别名。
答案 2 :(得分: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 = $ result ['sites_indexed_id']; $ var_b = $ result ['individual_data_id'];
答案 3 :(得分:1)
使用此表达式,您将获得列 id (来自表 sites_indexed )和 id2 (列 id <的别名)的结果/ strong>来自表 individual_data )
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