【问题标题】:Inner join 2 tables with same column names内连接2个具有相同列名的表
【发布时间】: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

标签: php mysql inner-join


【解决方案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 中选择它们时更容易区分

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 2021-11-25
        • 2021-07-08
        • 2012-09-13
        • 2016-03-24
        • 1970-01-01
        相关资源
        最近更新 更多