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

返回結果通過上面的SQL將包括A和B如何從PHP獲取多行同名列的MySQL行結果?

的東西都列,如果A和B具有相同的名稱某些列?

如何檢索PHP的值?

+0

你會得到一個錯誤,說明不明確的列 - 數據庫不能告訴要使用的兩列具有相同的名稱。 – 2009-09-13 06:12:14

+4

@rexem:這是不正確的。 SQL絕對正確,如果查詢明確選擇了兩個表中存在的列名,但沒有指定表前綴,則會發生錯誤。 – quosoo 2009-09-13 06:27:08

回答

18

您可能希望在查詢中更加明確。這樣,你可以爲你的列提供別名:

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

如果你只需要第二張表中的幾列,你可以(在mysql中)執行類似「SELECT a。*,b.column_that_also_exist_in_a as someAliase ...」 – timdev 2009-09-13 06:17:14

+0

@tim:應該能夠在任何符合ANSI標準的數據庫系統。 – 2009-09-13 06:31:48

7

答案是actualy在PHP documentation

「如果結果的兩列或多列具有相同字段名,最後一列將優先要訪問同名的另一列(S),您可能需要使用mysql_fetch_row()與數字索引來訪問結果或添加別名。請參見在mysql_fetch_array()說明有關別名的例子。「

特別是具有mysql_fetch_array()似乎當你成爲最好的候選人堅持在select語句中使用星:

$row = mysql_fetch_array($result, MYSQL_BOTH) 

然後你就可以$row[name],並通過$row[col_number]的ambigous一個參考unambigous領域,但限制你的代碼的可移植性(也許MySQL的下一個版本將要以不同的順序返回列?)。推薦的解決方案是重寫您的查詢,並列出所有必填字段,而不是使用星號和不明確的字段 - 使用別名。

+0

你能提供演示嗎? – omg 2009-09-13 10:25:17

1

在ResultSet對象的Java + MySQL中,如果查詢類似於「SELECT a.id,b」,則可以使用例如getString(「a.id」)和getString(「b.id」)。 ID FROM a,b「

我不知道如果在PHP中有這樣的東西。

問候

1

這可能是給別人有用的:因爲我使用一些模板,我是不會輕易使用別名每一次,我想,易於使用的關聯數組。 CREDIT段落符號爲他的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));