2012-05-19 13 views
6

Często używam następującego zapytania, ale jestem pewien, że musi to być bardziej wydajny sposób.Bardziej efektywny sposób na uruchamianie zapytania date/yyyy?

Zasadniczo Liczę dziesięcioleci ludzie urodzili się, ze w tabeli użytkownika:

select count(*) as howmany, yyyy from bday where (((yyyy > '1949') 
AND (yyyy < '1961')) AND (user_id = '63')) UNION 
select count(*) as howmany, yyyy from bday where (((yyyy > '1959') 
AND (yyyy < '1971')) AND (user_id = '63')) UNION 
select count(*) as howmany, yyyy from bday where (((yyyy > '1969') 
AND (yyyy < '1981')) AND (user_id = '63')) UNION 
select count(*) as howmany, yyyy from bday where (((yyyy > '1979') 
AND (yyyy < '1991')) AND (user_id = '63')) UNION 
select count(*) as howmany, yyyy from bday where (((yyyy > '1989') 
AND (yyyy < '2001')) AND (user_id = '63')) 
+2

czy nie zwraca 1 wiersza z liczbą = 1 i rrrr dla tego konkretnego "user_id"? – Aprillion

+0

@deathApril Nie, kwerenda działa idealnie, pokazując osobną linię z ilu na każdą dekadę –

+0

, więc nie masz unikalnych 'user_id's? – Aprillion

Odpowiedz

6

Można obliczyć dekadę i użyć go do grupy użytkowników:

SELECT 
    COUNT(id) AS howmany, 
    CEIL((`yyyy`+1)/10) AS decade, 
    yyyy 
FROM `bday` 
GROUP BY decade 
+0

+1, chociaż 'yyyy DIV 10' może być nieco bardziej przejrzysty (po prostu IMHO). –

0

do liczyć dziesiątki osób urodzonych w:

select substring(yyyy, 1, 3) || '0''s' decade, count(*) howmany 
from bday 
group by decade 
Powiązane problemy