Mysql在where子句中使用列别名

时间:2014-12-01 18:50:32

标签: php mysql

我有一个Mysql查询:

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,因此我需要始终使用相同的列名

3 个答案:

答案 0 :(得分:1)

如果您必须使用别名作为选择条件的一部分,则需要使用HAVING而不是WHERE

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

但最好使用列名和WHERE,因为阅读代码的其他人会发现WHERE的含义比HAVING更明显;它不会有效地使用你的表索引

答案 1 :(得分:0)

你问,"有没有办法以我想要的方式去做?"

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

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 clause
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING条款
  5. SELECT条款
  6. ORDER BY子句
  7. (从http://www.bennadel.com/blog/70-sql-query-order-of-operations.htm获取的顺序) 找到了不同的订单MySQL Order of Operations?

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

    因此在评估select之前执行where子句。因此,它还不知道你是否混淆了它。你可以通过做一个子选择,在from子句中按照你想要的方式使数据列变得愚蠢。

答案 2 :(得分:0)

哪里不对别名起作用..更好的是table_name.column_namem你可以在group by中使用列的别名。

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