2015-04-17 4 views
1

Мне нужно сосчитать людей с возрастом> 60, но MySQL return 0. Пожалуйста, помогите мне.Возраст от MySQL с фильтром

SELECT 
    count(*), 
    TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age 
FROM 
    voluntario v 
WHERE 
    v.id_status = 1 
    HAVING age >= 60 

Спасибо!

+0

Посмотрите мой ответ – xsami

ответ

0

Почему бы вам не сделать это:

SELECT 
    count(*), 
    birth_date 
FROM 
    voluntario v 
WHERE 
    v.id_status = 1 AND TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) >= 60 
1

Причина, по которой ваш вопрос не работает, потому что это запрос агрегации. Следовательно, having применяется после агрегации. Для фильтрации до агрегации используйте пункт where.

Это достаточно легко сделать:

SELECT count(*) 
FROM voluntario v 
WHERE v.id_status = 1 AND 
     v.birth_date < date_sub(CURDATE(), interval 60 year) 

Обратите внимание, что дата арифметика выполняется на CURDATE(), а не на birth_date. Это позволяет использовать индекс, содержащий birth_date для запроса (при необходимости).

Имея age в SELECT, не имеет смысла, поскольку существует (потенциально) много разных возрастов и только одно неопределенное значение возвращается запросом.