内连接2个具有相同列名的表
Posted
技术标签:
【中文标题】内连接2个具有相同列名的表【英文标题】:Inner join 2 tables with same column names 【发布时间】:2013-04-19 05:56:23 【问题描述】:我正在努力在我的网站上显示我的 Minecraft 服务器上的成就。 但我无法让它工作。
function achievements()
global $id;
$sql="SELECT * FROM achievements
INNER JOIN stats ON achievements.type=stats.type
INNER JOIN stats ON achievements.block=stats.block
INNER JOIN stats ON achievements.data=stats.data
INNER JOIN stats ON achievements.value=stats.value
WHERE player_id = $id";
$result=mysql_query($sql) or die(mysql_error());
$rows=mysql_fetch_array($result);
我能否使用$rows['achievements.type'];
和$rows['stats.type'];
从所选表中获取“类型”列,或者有其他方法吗?
列名和表名是我用的插件定义的,不能改名。
【问题讨论】:
SELECT *, stats.type AS stats_type
然后以$rows['stats_type'];
访问,但要小心,因为 $rows['type'] 将来自最后一个表stats, achievements
【参考方案1】:
它不工作的原因是(在我自己看来)服务器对于如何正确处理列名有点困惑。为了使其正常工作,请在每个具有相同名称的表上添加一个别名,以加入您要加入的列以及列,例如
SELECT achievements.*,
a.Name as TypeName,
b.Name AS BlockName,
c.Name as DataName,
d.Name AS ValueName
FROM achievements
INNER JOIN stats a ON achievements.type = a.type
INNER JOIN stats b ON achievements.block = b.block
INNER JOIN stats c ON achievements.data = c.data
INNER JOIN stats d ON achievements.value = d.value
WHERE player_id = $id
假设您想要获取每个特定列的名称。
【讨论】:
【参考方案2】:在SELECT
时为您希望拥有的列提供别名,例如:
SELECT `achievements`.`type` AS `Achieve-Type`
FROM `achievements`
现在你可以得到这样的值:$rows['Achieve-Type'];
【讨论】:
【参考方案3】:用...为表名起别名更容易
SELECT * FROM achievements AS ac INNER JOIN stats as st
如果您愿意,您甚至可以为结果设置别名,以便在您从 $rows
中选择它们时更容易区分
【讨论】:
以上是关于内连接2个具有相同列名的表的主要内容,如果未能解决你的问题,请参考以下文章