2014-10-09 1 views
1

ID가있는 테이블, 발생한 날짜와 시간, 설명을 볼 수 있습니다. 내가보고 싶은 것은 카운트가MySQL : 무언가가 발생하지 않은 요일에 대한 쿼리

mysql> select distinct(DATE(HEADER_DATE)) from emails_inbound where WEEKDAY(HEADER_DATE) = 6; 
+---------------------+ 
| (DATE(HEADER_DATE)) | 
+---------------------+ 
| 2014-09-21   | 
| 2014-09-28   | 
| 2014-10-05   | 
+---------------------+ 
3 rows in set (0.00 sec) 

: 뭔가 다음과 일주일의 하루 동안 발생하는 해당 테이블로

, 나는 횟수를 조회 할 수있었습니다 특정 일 이후 시작된 아무 일도 발생하지 않은 (이 날에 반환 된 결과 없음) 요일의 수 (이 예에서는 일요일).

즉, 2014 년 9 월 1 일 이후로 일요일에 몇 개의 결과가 포함되어 있습니까? 사전에

많은 감사합니다!

+0

distinct는 함수가 아닙니다. – Strawberry

+0

나는이 질문이 내 답변에 대한 코멘트라고 가정합니다. 캐치 주셔서 감사합니다! 나는 대답을 고쳤다. – Ruslan

답변

2

원하는 날짜 범위에서 매일 행을 제공하는 임시 테이블을 구성한 다음 주 테이블에 대해 LEFT JOIN이고 평일에는 GROUP BY입니다.

내가 처분 할 수있는 MySQL이 없으며 SQLFiddle (스키마 비 혼합 문인 &)에서 수행하기가 어려울 것 같지만 다음 코드는있는 그대로 또는 아주 사소한 조작으로 작동해야합니다. 나는 당신의 emails_inbound 테이블의 ID 열이 id이라고 가정한다. 그것이 다른 것이라면 e.ide.whatever으로 변경하십시오.

drop temp table if exists t_tmp; 

create temp table t_tmp (
my_date date 
) engine=memory; 

declare v_startDate date; 
declare v_endDate date; 

set v_startDate = '10-1-2014'; -- YOUR START DATE 
set v_endDate = '10-10-2014'; -- YOUR END DATE 

while (v_startDate < v_endDate) do 
    insert into t_tmp values (v_startDate); 
    set v_startDate = v_startDate + interval 1 day; 
end while; 

select weekday(date(e.header_date)) as day_of_week, 
     count(e.id) as number_of_days_when_this_event_happened, 
     sum(case when e.id is not null then 0 else 1 end) as number_of_days_when_this_event_did_not_happen 
from t_tmp x 
    left join emails_inbound e on date(e.header_date) = x.my_date 
group by weekday(date(e.header_date)) 

drop temp table t_tmp;