2012-03-22 22 views
0

私はmysqlデータベースを持っていて、茶色で最大2歳までのすべての動物を結果に表示しようとしています。私が得ることができるのはこれだけで、年齢の値を表示するだけで、それをフィルタリングしないと< = 2になります。Where句、カラムエイリアス

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

あなたのお手伝いがあります。

+1

を行う場所でのselect句のこのエイリアスを使用することはできません、それははるかに容易になるだろう。 –

答えて

1

あなたは句が、このrepeateに

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; 
+0

ありがとうございます。私は年齢の列を隠す必要がありますが、私はこれをどのようにすることができますか? – user1264074

+0

選択句 –

+0

から削除してください! 選択名、DOB 動物由来 ここでcolor = 'Brown'とtruncate(datediff(sysdate()、DOB)/365.25,0)<2 ORDER BY DOB; – user1264074

0

はあなたがDOBない計算フィールドに基づいてフィルタリングを行う必要があります - 受け入れ答えの光で

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

EDITを私は私の答えを説明する必要性を感じています。使用 - それは年齢が無用DOBコラム上の任意のインデックスをレンダリング、比較を行うために計算することが必要なため、年齢をフィルタリングするための方法として

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

は効率的ではありません。一方で、その後、任意の適用可能なインデックスを使用することができます直接DOBフィールド上でフィルタリング -

DOB > (CURRENT_DATE - INTERVAL 3 YEAR); 

これは、単純に言うと、「誕生日は今日マイナス3年以上です」。

順番になっ
'2009-03-22' > ('2012-03-22' - INTERVAL 3 YEAR) 

- -

評価さ
'2009-03-22' > '2009-03-22' 

だから、「2009年3月22日」の誕生日と「2012-03-22」は現在の日付があると評価されますその人は今3(今日)であるので、偽にする。順番になる

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

- -

真と評価
'2009-03-23' > '2009-03-22' 

人の誕生日は明日( '2009-03-23')であれば、一方で彼らはまだ2です。

0

HAVING age <= 2を使用する必要があります。あなたはsqlfiddle.com上の例を設定することができれば

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

+0

ありがとうございますが、年齢の列を表示しない方法はありますか?<= 2の動物を表示するだけですか? – user1264074

+0

HAVING truncate(datediff(sysdate()、DOB)/ 365.25,0)を使用してください。 –