2010-03-26 136 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($结果))