2010-03-26 92 views
2

我有兩張桌子。如何訪問MySQL LEFT JOIN查詢中的兩個同名列?

TABLE_X:

id INT(11) 
tag INT(11) 

table_tags:

id INT(11) 
name VARCHAR(255) 

然後我用PHP來執行下面的查詢:

SELECT * FROM table_x LEFT JOIN table_tags ON table_x.tag = table_tags.id 

唯一的問題是:我怎麼訪問table_x.idtable_tags.id的結果?

這裏是PHP代碼:

$query = "SELECT * FROM table_x LEFT JOIN table_tags ON table_x.tag = table_tags.id"; 
$results = mysql_query($query); 

while($row = mysql_fetch_array($results)) 
{ 
    // how do I now access table_x.id and table_tags.id ??? 
} 
+0

這並不難,如果你{

**//fetch id of table_x with xid** **echo "table_x id: ".$row['xid'];** 

//與TID

**echo "table_tags id: ".$row['tid'];** 

取table_tags的ID}請勿選擇*,但請逐列選擇。你正在尋找一種方法來做到這一點沒有選擇*? – stevedbrown 2010-03-26 22:11:55

+0

不,如果可能的話。我需要'*'。當然,如果沒有其他辦法,我會放棄它。 – 2010-03-26 22:14:09

回答

4

你的名字列在列的列表:

SELECT 
    table_x.id AS x_id, 
    table_tags.id AS tag_id, 
    other, columns, here 
FROM table_x LEFT JOIN table_tags 
ON table_x.tag = table_tags.id 

在一般情況下,它被認爲是很好的形式來命名你想返回的列明確,而不是依賴於*(如果基礎表結構發生變化,可能會導致實際的數量,順序和列名稱發生變化)。與此同時,您可以在結果集中使用新名稱對列進行別名,以方便使用(在大多數SQL方言中,AS關鍵字是可選的)。

更新: OP在註釋中聲明他必須使用「*」。雖然不建議這樣做,你可以這樣做:

SELECT 
    table_x.id AS x_id, 
    table_tags.id AS tag_id, 
    * 
FROM table_x LEFT JOIN table_tags 
ON table_x.tag = table_tags.id 

它結合了你想要的命名的列和(差)「*」的技術。您的列將包含在結果集中兩次,前兩列列和列列表中的常規位置。值將是相同的。

+0

還有別的辦法嗎?我真的需要在我的查詢中使用'*'。 – 2010-03-26 22:12:25

+0

+1你打敗了我larry – jps 2010-03-26 22:15:20

+1

你不應該使用*。但是,如果必須的話,您應該能夠使用整數索引將列值存入每行數據。當然,你將完全依賴列號和順序,並且你的代碼將在未來中斷。您也可以遍歷結果數據集中返回列名的列表,但我不知道該信息是否包含源表的名稱。 – 2010-03-26 22:16:41

1

使用方法如下

$查詢= 「選擇(table_x.id)AS XID,(table_tags.id)爲tID FROM TABLE_X LEFT JOIN table_tags ON table_x.tag = table_tags.id」;

$ results = mysql_query($ query);

而($行= mysql_fetch_array($結果))