内连接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个具有相同列名的表的主要内容,如果未能解决你的问题,请参考以下文章

具有相同列名的 MySQL 连接表

连接两个具有不同键名的表

mysql多个表之间的连接方式(内连接左连接右连接)delete删除表内数据的方法以及mysql索引

小表内连接大表,如何加快

连接多个具有相同前缀名称的表

SQL 内连接 2 个具有多列条件的表并更新