web-dev-qa-db-ja.com

同じ列名の2つのテーブルを内部結合します

Minecraftサーバーからの成果を自分のWebサイトに表示するように取り組んでいます。しかし、私はそれを機能させることができません。

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'];を使用して、選択したテーブルから列「タイプ」を取得できますか、それとも別の方法がありますか?

列とテーブルの名前は私が使用するプラグインによって定義されているため、名前を変更することはできません。

13
Lars Kaptein

それが機能しない理由は、(私自身の意見では)サーバーが列名を適切に処理する方法について少し混乱しているためです。それが機能するために、結合したい同じ名前を持つすべてのテーブルと列にエイリアスを追加します。

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

特定の列ごとに名前を取得する

24
John Woo

例として、SELECTするときに必要な列にエイリアスを指定します:

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

これで、次のような値を取得できます。$rows['Achieve-Type'];

6
user2319427

テーブル名のエイリアスを作成する方が簡単です...

SELECT * FROM achievements AS ac INNER JOIN stats as st

必要に応じて結果にエイリアスを付けて、$rowsから結果を選択したときに区別しやすくすることもできます。

1
david99world