MySQL выбрать перекрывающийся счетчик - PullRequest
2 голосов
/ 30 марта 2012

Я хотел бы объединить эти четыре запроса в один:

SELECT COUNT(ID) FROM conversations WHERE DAY(create_time)=DAY(NOW());
SELECT COUNT(ID) FROM conversations WHERE WEEKOFYEAR(create_time)=WEEKOFYEAR(NOW());
SELECT COUNT(ID) FROM conversations WHERE MONTH(create_time)=MONTH(NOW());
SELECT COUNT(ID) FROM conversations WHERE YEAR(create_time)=YEAR(NOW());

Этот единственный запрос вернется ко мне, например

день => количество разговоров с сегодняшнего дня,

week => количество разговоров с этой недели,

month => количество разговоров за этот месяц,

год => количество разговоров с этого года

Я думал, что у меня там какой-то синтаксис CASE (я не эксперт по MySQL), но понял, что каждая запись может быть подсчитана только в одном случае, и мне нужно, чтобы они перекрывались. Другими словами, я мог бы подсчитать одну запись для одного из этих случаев, двух, трех или всех четырех.

Ответы [ 2 ]

4 голосов
/ 30 марта 2012
select
    sum(case when DAY(create_time)=DAY(NOW()) then 1 else 0 end) as DayCount,
    sum(case when WEEKOFYEAR(create_time)=WEEKOFYEAR(NOW()) then 1 else 0 end) as WeekCount,
    sum(case when MONTH(create_time)=MONTH(NOW()) then 1 else 0 end) as MonthCount,
    sum(case when YEAR(create_time)=YEAR(NOW()) then 1 else 0 end) as YearCount
from
    conversations
where
    YEAR(create_time)=YEAR(NOW())

Демо: http://www.sqlfiddle.com/#!2/e62f0/1

1 голос
/ 30 марта 2012

Ознакомьтесь с документацией для UNION .
Пример использования:

SELECT COUNT(ID) FROM conversations WHERE DAY(create_time)=DAY(NOW());
UNION ALL
SELECT COUNT(ID) FROM conversations WHERE WEEKOFYEAR(create_time)=WEEKOFYEAR(NOW());
UNION ALL 
SELECT COUNT(ID) FROM conversations WHERE MONTH(create_time)=MONTH(NOW());
UNION ALL
SELECT COUNT(ID) FROM conversations WHERE YEAR(create_time)=YEAR(NOW());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...