内连接具有相同列名的2个表

时间:2013-04-25 11:03:30

标签: php mysql inner-join

我正在努力在我的网站上显示我的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'];从所选表中获取“类型”列,还是有另一种方法可以执行此操作?

列名和表名由我使用的插件定义,因此名称不能更改。

3 个答案:

答案 0 :(得分:22)

它无法工作的原因是因为(我自己认为)服务器对于如何正确处理列名称有点困惑。为了使它起作用,在每个具有您想要加入的名称的表以及列上添加别名,例如

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

假设您希望获取每个特定列的名称

答案 1 :(得分:6)

在您SELECT别名时给出您想拥有的列,例如:

SELECT `achievements`.`type` AS `Achieve-Type`
FROM `achievements`

现在您可以获得如下值:$rows['Achieve-Type'];

答案 2 :(得分:1)

使用...

对表名进行别名更容易
SELECT * FROM achievements AS ac INNER JOIN stats as st

如果您愿意,您甚至可以对结果进行别名,这样当您从$rows

中选择它们时,它们就更容易区分