起因是学习群里有朋友提了一个问题,大概意思是这样子的:
首先用时间函数对于表中的ARRIVE_TIME进行相减操作,然后再获得需要的与之对应的数据
比如,我想查找表中ARRIVE_TIME距离今天2天的数据
我的第一反应就是
select *,DATEDIFF(now(),bbd.ARRIVE_TIME ) days from mappertest.bs_business_details bbd where bbd.days = 2
很遗憾的是反馈出来的是Unknown column
那么这是为什么呢?不是已经查出了days嘛?为什么不能用where去判断?
随后我去百度了一下sql关键字的执行顺序,似乎就有了答案。(引用:https://blog.csdn.net/qq_36381855/article/details/80051265)
原来where是在select之前执行的,意思就是where后面的条件,那些字段必须是前面表中已经有的字段,或者是联表中的字段,而不能是通过某些函数、方法计算出来的字段,where是查找不到的;
如果非要使用where进行查询那么我个人的理解是先将查询到的数据搭建为一张临时表,再在临时表中进行查找,代码如下:
select
*
from
(
select
*, DATEDIFF(now(), bbd.ARRIVE_TIME ) days
from
mappertest.bs_business_details bbd ) t
where
t.days = 628
结果:
但是这种方法看起来难免有点笨重,群友提供了一种新的解决办法:
select
*,
DATEDIFF(now(), bbd.ARRIVE_TIME ) days
from
mappertest.bs_business_details bbd
having
days = 628
结果又正常了,但是由上图我们可知having的执行顺序也是在select之前的,按理来说会跟where关键字一样报找不到对应列的错误,那么为什么可以呢?
MySQL额外提供了这种场景的解决方案,详细方案可以看官方文档:https://dev.mysql.com/doc/refman/5.7/en/select.html