使用mysql列别名在where子句

问题描述:

我有一个MySQL查询:使用mysql列别名在where子句

SELECT created_at as date FROM table 

所以我创建了created_at列的别名。现在我想在我的WHERE子句中使用这个别名:

SELECT created_at as date FROM table WHERE date = 'xxxx-xx-xx' 

这不起作用。 Mysql希望我使用真正的列名。有什么办法以我想要的方式去做?

背景:我从几个表中选择记录并使用UNION将它们联合起来。所有表都有一个日期列,但在每个表中命名都不同。但我想对联合记录做WHERE,因此我需要始终使用相同的列名称

+0

利用你的表索引一个外部选择以上的所有工会,然后在哪里用日期。 – 2014-12-01 18:51:58

+1

您不能在查询的子句中使用别名,就像您在此处所做的那样。你真的不应该使用几乎与关键字重复的别名。 – 2014-12-01 18:52:03

您问:“有没有办法按照我想要的方式去做?

是的,但它需要使用子查询或视图。

SELECT date 
FROM (SELECT created_at as date FROM table) B 
WHERE date = 'xxxx-xx-xx' 

随着工会的情况下...

SELECT * from (
Select col1, col2,col3 as date from A 
union 
select col1, col4,col5 from B) inlineView 
WHERE date = 'somedate' 

你正在运行到的问题是操作的数据库中的顺序。

  1. FROM子句
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING子句
  5. SELECT子句
  6. ORDER BY子句

(顺序从http://www.bennadel.com/blog/70-sql-query-order-of-operations.htm截取) 不同订单被发现MySQL Order of Operations?

所以现在我必须做一些研究来找出哪一个是正确的;或者它是否因RDBMS而异...

因此where子句在select被评估之前被执行。因此,它不知道你有别名。你可以欺骗编译器,通过做一个子选择来按照你想要的from子句的方式创建数据列。

如果你绝对必须使用你的别名作为选择标准的一部分,那么你需要使用HAVING而非WHERE

SELECT created_at as date FROM table HAVING date = 'xxxx-xx-xx' 

但它是更好,因为其他人阅读使用的列名和WHERE您代码会发现WHERE的含义比HAVING更明显;它将不能有效地要么

哪里不对别名工作..你更好,你可以通过使用列的别名组table_name.column_namem ..

SELECT created_at FROM table WHERE table.created_at = 'xxxx-xx-xx' <--more readable, isn't it?