在MySQL的SELECT语句中使用表名作为"AS"

6

当我在PHP中评估MySQL SELECT JOIN结果时,我使用表名构建嵌套数组。然而,在使用AS进行计算列时,我似乎无法按照预期设置表名(为了简化,我在此示例中尝试不使用JOIN,但问题是相同的):

SELECT `field1`, `field2`, "Test" AS `Table`.`field3` FROM `Test`;

这会抛出一个错误。

我该如何在SQL中指示我想要将field3与哪个表关联?

(导致$pdoStatement->getColumnMeta()中的表名为"Table")

2个回答

13

要将字符串文字声明为输出列,可以省略Table并只使用Test。它不需要与连接中的表相关联,因为它只能通过其列别名访问。当使用像getColumnMeta()这样的元数据函数时,表名将是一个空字符串,因为它没有与表相关联。

SELECT
  `field1`, 
  `field2`, 
  'Test' AS `field3` 
FROM `Test`;

注意:上面我使用的是单引号。MySQL通常会配置为支持在字符串中使用双引号,但是单引号在关系型数据库管理系统中更广泛地可移植。

如果你必须使用一个带有文本值的表别名,你需要将它包装在一个与所需使用的表相同名称的子查询中:

SELECT
  field1,
  field2,
  field3
FROM 
  /* subquery wraps all fields to put the literal inside a table */
  (SELECT field1, field2, 'Test' AS field3 FROM Test) AS Test

现在field3将作为Test.field3出现在输出中。


感谢您的快速回复,但我认为您误解了我的意图。我希望通过AS将声明的列与特定表关联起来,这样当我稍后评估结果集时,$pdoStatement->getColumnMeta()将认为表名是“Table1”,而不是空的。 - preyz
@preyz 我理解你的意图,但是你不能这样做,因为文本值并没有与任何表相关联。除非你通过查询连接来假装它,否则你无法欺骗它 - 我将在上面添加一个示例。 - Michael Berkowski
@preyz上面添加了一个hack——这真的是唯一的方法。 - Michael Berkowski

1

Test中选择field1field2和'Test'作为field3的值;// 用单引号替换


谢谢,但我认为你和Michael Berkowski做出了相同的假设。请看一下我对他回答的评论。 - preyz
我很高兴能帮助你,Preyz。我复制并粘贴了你在问题中的脚本,并进行了更正,这是一个简单的问题。 - Aghilas Yakoub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接