无法显示特定年龄

时间:2014-02-19 23:50:22

标签: mysql

SELECT Name, doB, Age CURDATE( ) , (
YEAR( CURDATE( ) ) - YEAR( F )
) - ( RIGHT( CURDATE( ) , 5 ) < RIGHT( F, 5 ) ) AS Ages
SELECT Name, DoB, Ages WHERE Age=20 As Age
FROM Table_
ORDER BY N

如果我只想显示20岁时人的名字,如果Age列是临时列,我在哪里放where AGES=20

- 编辑 - 原始查询是:

SELECT N, F, CURDATE( ) , 
       ( YEAR( CURDATE( ) ) - YEAR( F ) ) 
       - ( RIGHT( CURDATE( ) , 5 ) < RIGHT( F, 5 ) ) AS Age 
FROM edad_ LIMIT 0 , 30 

1 个答案:

答案 0 :(得分:2)

我无法对你的查询做出正面或反面。

但是要回答你的问题,WHERE子句中不允许派生列的谓词,但它可以包含在HAVING子句中。例如:

SELECT t.DoB
     , TIMESTAMPDIFF(YEAR, t.DoB, CURDATE()) AS age
  FROM mytable t
HAVING age = 20

BUT ...

了解性能问题。请注意,在检索并准备好所有行之后,在查询处理中很晚才应用HAVING子句。它更像是对返回的行的过滤器,而WHERE子句充当对检索到的行的过滤器,在查询的早期处理过。

对于大型集合的性能,我们通常希望从索引范围扫描中受益,因此我们在本机列上使用等效谓词。 (如果有合适的索引可用。)

例如,如果DoB上的索引可用:

SELECT t.DoB
     , TIMESTAMPDIFF(YEAR, t.DoB, CURDATE()) AS age
  FROM mytable t
 WHERE t.DoB >= CURDATE() + INTERVAL -21 YEAR
   AND t.DoB <  CURDATE() + INTERVAL -20 YEAR

(注意:您可能需要将>=替换为>并将<替换为<=,以便在边缘情况下按照您希望的方式运行年龄计算CURDATE与DoB完全相差20年或完全是21年。)