【问题标题】:How can you access two identically-named columns in a MySQL LEFT JOIN query?如何访问 MySQL LEFT JOIN 查询中的两个同名列?
【发布时间】:2010-03-26 22:09:29
【问题描述】:

我有两张桌子。

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 ???
}

【问题讨论】:

  • 不选*也不难,而是逐列选择。您是否正在寻找一种无需选择 * 的方法?
  • 不,如果可能的话。我需要*。当然,如果没有别的办法,我就放弃了。

标签: php mysql join


【解决方案1】:

您为列列表中的列命名:

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

一般来说,明确地命名您想要返回的列而不是依赖于 * 被认为是一种好的形式(如果基础表结构发生变化,这可能会导致列的实际数量、顺序和名称发生变化)。同时,您可以在结果集中为该列加上新名称以方便使用(AS 关键字在大多数 SQL 方言中是可选的)。

更新: 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

它结合了您想要的命名列和(坏的)“*”技术。您的列将两次包含在结果集中,分别位于前两列位置和列列表中的常规位置。值将相同。

【讨论】:

  • 还有其他方法吗?我真的需要在我的查询中使用*
  • 你不应该使用 *.但是,如果必须,您应该能够使用整数索引获取每行数据的列值。当然,您将完全依赖于列号和顺序,并且您的代码将来会中断。您也许还可以遍历结果数据集中返回的列名列表,但我不知道该信息是否包括源表的名称。
  • 哦,还有一个想法: SELECT col1 AS name1, col2 as name2, * FROM 。 . .结合了这两种技术。
  • 哦,完美!不过为时已晚...我只是将代码更改为不使用*,无论如何这都是个好主意。不过,感谢您的提示。
【解决方案2】:

这样使用

$query = "SELECT (table_x.id) AS xid, (table_tags.id) AS tid FROM table_x LEFT JOIN table_tags ON table_x.tag = table_tags.id";

$results = mysql_query($query);

while($row = mysql_fetch_array($results)) {

**//fetch id of table_x with xid**

 **echo "table_x id: ".$row['xid'];**

//用tid获取table_tags的id

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2015-02-22
    • 2012-09-05
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多