2009-09-13 7 views
9
select * from A left join B on A.columnc=B.columnd 

結果は、AとBが同じ名前を持ついくつかの列を持っている場合は、両方のAとB複数の同じ名前の列を持つMySQL行の結果をPHPで取得するにはどうすればよいですか?

の列と何が含まれるSQLの上で返されますか?

PHPから値を取得する方法は?

+0

あなたはあいまいな列を示すエラーを取得したい - データベースが同じ名前を持つ2つの列のどれを使用するように伝えることはできません。 –

+4

@rexem:そうではありません。 SQLは絶対に正しいですが、クエリが両方のテーブルに存在するカラム名を明示的に選択していて、テーブル接頭辞を指定していない場合は、エラーが発生します。 – quosoo

答えて

18

あなたの質問にもっと明白になりたいと思うかもしれません。あなたは、列のエイリアスを提供することができますその方法:

SELECT 
    A.foo as a_foo, 
    B.foo as b_foo 
FROM A 
LEFT JOIN B ON A.columnc = B.columnd 
+0

2番目のテーブルからいくつかのカラムだけが必要な場合は、 "mysqlの場合は、SELECT a。*、b.column_that_also_exist_in_a as someAliase ..."のようにすることができます。 – timdev

+0

@tim:これを行う必要があります任意のANSI準拠データベースシステム –

7

答えはPHP documentationにactualyです:

「結果の2つの以上のカラムが同じフィールド名を持っている場合は、最後の列が優先されます。同じ名前の他のカラムにアクセスするには、次のいずれかがmysql_fetch_row()を使用して、数値指標と結果にアクセスするか、エイリアス名を追加する必要があります。エイリアスのmysql_fetch_array()説明で例を参照してください。」

Especialy mysql_fetch_array()はそうあなたが最高の候補者になれるようにそして、あなたは$row[name]によっておよび$row[col_number]によって不明瞭1に曖昧でないフィールドを参照することができ

$row = mysql_fetch_array($result, MYSQL_BOTH) 

、それは(多分のMySQLの次のバージョンがために起こっているあなたのコードの移植性を制限:SELECTステートメントでスターを使用して主張列を別の順序で返しますか?)。推奨される解決策は、クエリを書き換えて、starを使用するのではなく、あいまいなものを使用する代わりに、必要なフィールドをすべて一覧表示することです。

+0

デモを提供できますか? – omg

1

ResultSetオブジェクトのJava + MySQLでは、クエリが "SELECT a.id、b。"のような場合は、getString( "a.id")やgetString( "b.id")などを使用できます。 id FROM a、b "

このようなことがPHPにある場合は、私は気にしません。

よろしく

1

これは誰かに有用である可能性がある:私はいくつかのテンプレートを使用していたので、私は簡単にするたびにエイリアスを使用することができなかった、と私は使いやすさのために連想配列を望んでいました。 クレジットhow to mysql_fetch_array on joined tables, but columns have same name上の彼の答えのために段落記号が、MySQLiをしては:

$qualified_names = array(); 
for ($i = 0; $i < mysqli_num_fields($result); ++$i) { 
    $fieldinfo=mysqli_fetch_field_direct($result,$i); 
    $table = $fieldinfo->table; 
    $field = $fieldinfo->name; 
    $qualified_names["$table.$field"]="$table.$field"; 
} 
$newrow = array_combine($qualified_names, mysqli_fetch_array($result,MYSQLI_NUM)); 
関連する問題