Where子句,列别名

时间:2012-03-22 09:34:14

标签: mysql database

我有一个mysql数据库,我试图在结果中显示所有棕色的动物,最多2岁。我只能得到这个,它只是显示年龄值,而不是将其过滤到< = 2。

select name, DOB, 
truncate(datediff(sysdate(),DOB)/365.25,0) as 'age'
from animal
where colour = 'Brown' and 'age' <=2;

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

你不能在where子句中使用select子句的别名,重复执行

select name, DOB, 
truncate(datediff(sysdate(),DOB)/365.25,0) as 'age'
from animal
where colour = 'Brown' and truncate(datediff(sysdate(),DOB)/365.25,0) <=2;

答案 1 :(得分:0)

您应该根据DOB而不是计算字段进行过滤 -

SELECT name, DOB
FROM animal
WHERE colour = 'Brown'
AND DOB > (CURRENT_DATE - INTERVAL 3 YEAR);

编辑根据接受的答案,我觉得有必要解释我的答案。使用 -

where colour = 'Brown' and truncate(datediff(sysdate(),DOB)/365.25,0) <=2;

作为过滤年龄的方法效率不高,因为它需要计算年龄才能进行比较,使得DOB列上的任何索引都无效。然而,直接过滤DOB字段可以使用任何适用的索引 -

DOB > (CURRENT_DATE - INTERVAL 3 YEAR);

这简单地说“出生日期大于今天减去三年”。因此,“2009-03-22”的出生日期和“2012-03-22”的当前日期将被评估为 -

'2009-03-22' > ('2012-03-22' - INTERVAL 3 YEAR)

反过来变成了 -

'2009-03-22' > '2009-03-22'

评估为false,因为该人现在是3(今天)。然而,如果这个人的生日是明天('2009-03-23'),他们仍然是2 -

'2009-03-23' > ('2012-03-22' - INTERVAL 3 YEAR)

反过来变成了 -

'2009-03-23' > '2009-03-22'

评估为真。

答案 2 :(得分:0)

我认为你应该使用HAVING age <= 2

http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html