2012-03-22 7 views
0

У меня есть база данных mysql, и я пытаюсь показать в результатах все животные коричневые и не старше 2 лет. Все, что я могу получить, это, и он просто отображает возрастное значение и не фильтрует его до < = 2.Где предложение, псевдоним столбца

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

Ваша помощь приветствуется.

+1

Если вы могли бы установить пример на sqlfiddle.com, было бы гораздо проще. –

ответ

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 от животного где цвет = «коричневый» и усеченный (датированный (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 В свете принятого ответа я чувствую необходимость объяснить свой ответ. Использование -

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' 

, который оценивает к фальшивому, поскольку человеку сейчас 3 (сегодня). В то время как, если день рождения человека завтра ('2009-03-23') они все еще 2 -

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

, который в свою очередь становится -

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

, который оценивает к истине.

0

Я думаю, вы должны использовать HAVING age <= 2.

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

+0

Большое спасибо, но есть способ не показывать возрастную колонку, просто показать животных, которые <= 2? – user1264074

+0

использование HAVING truncate (dateiff (sysdate(), DOB) /365.25,0) <= 2 –

Смежные вопросы