不明确的字段名/使用 FETCH_OBJ 添加表名

Posted

技术标签:

【中文标题】不明确的字段名/使用 FETCH_OBJ 添加表名【英文标题】:Ambiguous field names / add table name with FETCH_OBJ 【发布时间】:2014-08-12 07:48:00 【问题描述】:

我有一个表 T1,其中有 2 个外键指向同一个表 T2。

所以,我的 SQL 语句是这样的:

SELECT *
FROM T1
INNER JOIN T2 AAA ON AAA.ID = T1.ID1
INNER JOIN T2 BBB ON BBB.ID = T1.ID2

(此 sql 有效)

然后,我使用$info = $exec->fetch(PDO::FETCH_ASSOC);

最后,我想使用 $info->AAA.name$info->BBB.name, 但我找不到如何将表名设置为读数。我会 喜欢通过添加十几个 ... AS ... 来避免更改我的 SQL

有什么想法吗?

【问题讨论】:

【参考方案1】:

更新1 我搜索了 PDO 文档并找到了指令PDO::ATTR_FETCH_TABLE_NAMES。文档说它使驱动程序在列名之前返回表名。表名将通过 '.'(dot) 与列名分隔。您可以尝试使用此指令来解决您的问题,但如果没有别名,它可能无法工作。. 请试穿:$PDO->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, true);

更新2 我从提问者那里找到了以下问题和答案,他们使用此指令解决了他的问题,类似于你的问题。SELECT result with table names for columns


这个问题重复了之前提出的其他几个问题:PDO: fetchAll() with duplicate column name on JOIN PDO Auto-aliasing when fetching?

所以,第一个答案是:“,如果不为每列设置别名,您将无法做到这一点。”

解决方法是使用PDO::FETCH_NUM,它将返回一个已获取列的编号数组。但我不推荐它,因为如果你改变表的结构,你的 php 脚本可能会损坏。

无论如何,选择某些列并设置别名而不是所有* 仍然是一个好习惯。像这样:

SELECT T1.ID1 as ID1, T1.ID2 as ID2, T1.name as T1_name, AAA.name as AAA_name, BBB.ID as BBB_name
FROM 
 T1
 INNER JOIN
 T2 AAA
  ON AAA.ID = T1.ID1
 INNER JOIN
 T2 BBB
  ON BBB.ID = T1.ID2

【讨论】:

以上是关于不明确的字段名/使用 FETCH_OBJ 添加表名的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库 DML 数据操作语言

表字段的操作

MYSQL第一章 创建表 修改表名 删除字段 添加字段 修改地段名

mysql增删改查 语句

如何获取数据库中表名、字段名、字段属性信息?

Mysql 常用Alter命令