2014-02-19 36 views
0
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歲的人的姓名,我該如何放置where AGES=20無法獲取特定的年齡來顯示

- 編輯 - 的oryginal查詢:

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

很難說,因爲問題中的select語句有語法錯誤且無法編譯。請先糾正查詢。 – krokodilko

+0

選擇N,F,CURDATE(),( 年(CURDATE()) - 年(F)) - (RIGHT(CURDATE(),5) user3330441

回答

2

我不能讓元首或查詢的尾巴。

但要回答您的問題,WHERE子句中不允許在派生列上使用謂詞,但它可以包含在HAVING子句中。例如:

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

但是...

注意的性能問題。請注意,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年。)

+0

爲什麼我們不能改變這個'選擇t.DoB ,TIMESTAMPDIFF(YEAR,t.DoB,CURDATE())AS 年齡MYTABLE牛逼 HAVING年齡= 20'到'選擇t.DoB ,TIMESTAMPDIFF (YEAR,t.DoB,CURDATE())AS age FROM mytable t WHERE TIMESTAMPDIFF(YEAR,t.DoB,CURDATE())= 20'? –

+0

@Akshat:OP的問題是如何引用謂詞中的列別名。你提出的改變當然可以做到。就性能而言,我們希望在WHERE和/或ON子句中使用謂詞,讓它們處於'HAVING'子句中。爲了獲得更好的性能,我們傾向於使用允許MySQL使用索引範圍掃描的謂詞,而不是要求全面掃描。請注意,MySQL必須在表中的每一行的WHERE條件中評估「age」表達式,這需要全面掃描。 – spencer7593