我有一个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
,因此我需要始终使用相同的列名
答案 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'
您遇到的问题是数据库中的操作顺序。
(从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?