0

我有一个表 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

任何的想法?

4

1 回答 1

4

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

UPDATE2
我从提问者那里找到了以下问题和答案,他们使用这个指令来解决他的问题,类似于你的问题。
SELECT 结果与列的表名


这个问题重复了之前提出的其他几个问题:
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


于 2014-08-12T08:24:48.610 回答