使用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
,因此我需要始终使用相同的列名称
答
您问:“有没有办法按照我想要的方式去做?
是的,但它需要使用子查询或视图。
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'
你正在运行到的问题是操作的数据库中的顺序。
- FROM子句
- WHERE子句
- GROUP BY子句
- HAVING子句
- SELECT子句
- 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?
利用你的表索引一个外部选择以上的所有工会,然后在哪里用日期。 – 2014-12-01 18:51:58
您不能在查询的子句中使用别名,就像您在此处所做的那样。你真的不应该使用几乎与关键字重复的别名。 – 2014-12-01 18:52:03