Mysql Alias等于的地方

时间:2011-02-06 19:02:58

标签: php mysql

给出一个带有列col1,col2的表'my_table'。
是否可以编写这样的查询

SELECT col1 as my_alias,col2 FROM my_table WHERE my_alias = 'value'

我已经尝试了但在where子句中获得了一个未知的列'my_alias'。

对于好奇,我这样做的原因是:

我有一张带有复合主键的表。当我从该表中检索信息时,我将构成主键的cols连接成Id,然后可以在我的url中使用它来识别特定记录。然后,当我想只返回给定的记录时,我选择记录所在的位置=我的别名。不确定这是不是一个好主意,随时评论。

注意:执行此查询的标准方法是:

SELECT col1 as my_alias,col2 FROM my_table WHERE col1 = 'value';

4 个答案:

答案 0 :(得分:5)

不,不允许。来自MySQL manual

  

12.2.8。 SELECT语法

     

...

     

不允许在WHERE子句中引用列别名,因为在执行WHERE子句时可能尚未确定列值。见Section C.5.5.4, “Problems with Column Aliases”

  

C.5.5.4。列别名的问题

     

可以在查询选择列表中使用别名为列提供不同的名称。您可以使用GROUP BY,ORDER BY或HAVING子句中的别名来引用该列。

     

...

     

标准SQL不允许在WHERE子句中引用列别名。


要解决此问题,您应该按如下方式编写查询:

SELECT col1 AS my_alias, col2
FROM my_table
WHERE col1 = 'value'

如果col1实际上不是单个列而是更复杂的表达式,那么您应该知道在WHERE子句中使用它很可能会阻止索引的有效使用并导致完整扫描。如果表变大,这可能会损害应用程序的性能。

答案 1 :(得分:2)

这不是直接可行的,但您可以使用子选择并在外部选择中使用列别名:

select my_alias, col2
from (SELECT col1 as my_alias,col2 FROM my_table) as x
WHERE my_alias = 'value'

答案 2 :(得分:1)

您可以在HAVING子句中使用它。

答案 3 :(得分:1)

看看这个Can you use an alias in the WHERE clause in mysql?答案有相同的声明,你需要对列操作的别名进行查询,所以如果你想在条件语句中使用别名,你必须使用 HAVING 所以它的作品,其他方式你必须在 SELECT WHERE 的地方使用你的concat操作。

相关问题