2012-05-29 2 views
3

지난 7 일간 사용자 활동을 검색하고 싶습니다. 내가 쿼리하는 테이블은 사용자, 이벤트 및 날짜를 ​​연결하는 다 대다 (many-to-many) 다.지난 N 일 동안의 N 개의 레코드가없는 매일의 레코드를 반환 하시겠습니까?

오늘이 5 월 7 일이지만 사용자가 5 월 4 일 및 2 일에 대한 활동 만 기록한 경우 활동이 기록되지 않은 날짜에 해당하는 NULL을 반환하는 쿼리를 작성할 수 있습니까?

소스

May 2  42 
May 4  88 

원하는 출력이이 MySQL의에서 수행 할 수있는 방법

May 1  NULL 
May 2  42 
May 3  NULL 
May 4  88 
May 5  NULL 
May 6  NULL 
May 7  NULL 

?

+2

당신이 간격없이, 날짜의 목록이 포함 된 테이블에 액세스 할 수있는 경우이 쉽게 될 것입니다. 그런 식탁이 있니? 그렇지 않다면 하나 만들어 보시 겠어요? –

+1

위의 Mark의 우수한 점은 관련 날짜가 결과 집합에없는 경우 응용 프로그램에서 암시 적으로 'NULL'이라고 가정하는 것입니다. – eggyal

답변

0
SELECT DISTINCT users, events, dates 
FROM table 
WHERE dates between date_format(date1, '%Y-%m-%d') 
and date_format(date2, '%Y-%m-%d') or NOW() or CURDATE().... 
and user = 'username' 

이 꽤 일반적이지만 이름과 날짜를 교체 할 경우 (아마 당신의 목적을 위해 포맷 할 필요는 없습니다)는 null 장소 보유자에 관계없이 모든 결과를 반환합니다

당신은 할 수 또한 내부 조인해야 내가 연도와 월을 인식하지만, 당신이 이것을 변경할 수 있습니다 단지에 날짜 형식을 사용

...

하십시오 date_reference_table를 채울 ... 여기에 저장이에 대한 PROC입니다 그럼 ... 내면 조인을 할거야. date_reference 테이블은 위의 주석에서 언급 한 결과를 출력합니다.

구분 $$

CREATE PROCEDURE `generate_date_reference_table`(d1 date, d2 date) 
BEGIN 
declare d datetime; 

create table BLMBP.date_reference (d char(7) not null); 

set d = d1; 
while d <= d2 do 
    insert into BLMBP.date_reference (d) values (date_format(d, '%Y-%m')); 
    set d = date_add(d, interval 1 month); 
end while; 

END$$ 
관련 문제