2013-08-15 4 views
2

매일 등록한 사용자의 합계를 반환하는 쿼리가 있습니다. 문제는 아무런 값도 반환하지 않는 아무도 등록하지 않았다면 그냥 건너 뜁니다. 나는 오히려이 지금까지결과가없는 날에 0을 반환합니다.

SELECT count(*) total FROM users WHERE created_at < NOW() AND created_at > 
DATE_SUB(NOW(), INTERVAL 7 DAY) AND owner_id = ? GROUP BY DAY(created_at) 
ORDER BY created_at DESC 

편집

내가 날짜 범위에 관해서는 각 기념일의 수를 얻을 것입니다 그래서 데이터를 그룹화 내 쿼리 제로

을 반환 것 지난 7 일 동안 등록 된 총 사용자 수를 원했습니다.

+1

가하는 일의 설정 라이브 데모를 참조하십시오 ... 정신인가? 항상? 그것은 큰 결과 집합이 될 것입니다. 당신은 일별 그룹화를하고 있습니다 - 그룹핑은 일반적으로 특정 그룹 키에 대한 그룹이없는 곳의 항목을 반환하지 않습니다. –

+1

그냥 말하고 싶습니다. 앱 로직이 이것을 할 수 없습니까? SQL 쿼리가 반환하는 데이터가 적을수록 좋습니다. 적은 데이터 = 빠름. 귀하의 애플 리케이션 로직이 쉽게 할 수 확신합니다. SQL을 수행 할 수 있다고 확신합니다. 효율성이 떨어지며 필요가 있습니까? – Jimmy

+1

[캘린더 테이블] (http://crazycoders.net/2012/03/using-a-calendar-table-in-mysql/)을 사용하십시오. –

답변

0

모든 요일을 보유한 테이블이 있다면 거기에서 왼쪽 테이블로 사용자 테이블을 조인 할 수 있습니다.

SELECT SUM(CASE WHEN U.Id IS NOT NULL THEN 1 ELSE 0 END) 
FROM DimDate D 
LEFT JOIN Users U ON CONVERT(DATE,U.Created_at) = D.DateValue 
WHERE YourCriteria 
GROUP BY YourGroupBy 
0

비트가 긴 호흡,하지만 난이 일을 생각 ... 그것은 오히려 쿼리가하고있는 일의 시간보다 날짜에 작동하는지 약간 쿼리와 다른

SELECT count(users.created_at) total FROM 
    (SELECT DATE_SUB(CURDATE(),INTERVAL 6 DAY) as cdate UNION ALL 
    SELECT DATE_SUB(CURDATE(),INTERVAL 5 DAY) UNION ALL 
    SELECT DATE_SUB(CURDATE(),INTERVAL 4 DAY) UNION ALL 
    SELECT DATE_SUB(CURDATE(),INTERVAL 3 DAY) UNION ALL 
    SELECT DATE_SUB(CURDATE(),INTERVAL 2 DAY) UNION ALL 
    SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY) UNION ALL 
    SELECT CURDATE()) t1 left join users 
ON date(created_at)=t1.cdate 
WHERE owner_id = ? or owner_id is null 
GROUP BY t1.cdate 
ORDER BY t1.cdate DESC 

. 귀하의 설명에서 나는 당신이 하루 종일을 사용한다는 것을 의미한다고 생각 했으므로 날짜를 사용했습니다.

+0

감사하지만 비어있는 결과를 반환합니다. –

+0

사용자 테이블의 정의입니까? – noz

0

까다로운 점은 데이터에서 '구멍'이있을 수있는 데이터 필드를 기준으로 그룹화하여 해당 날짜의 레코드를 놓치는 것입니다.

해결 방법은 지난 10 년 및 다음 100 년 동안의 모든 날짜가있는 표를 채우고 그 데이터를 (외부) 조인하는 것입니다. 그런 다음 매일 (또는 주간 또는 기타) 하나의 기록을 확실히 볼 수 있습니다.

MS SqlServer에서만이 작업을 수행해야 했으므로 날짜 테이블을 채우는 방법 (또는 동적으로 처리 할 수 ​​있음)은 다른 사람이 대답하는 것입니다.

1

주제의 변형 "당신의 칠일에 일정 인라인을 구축"그건 아마 조정이 필요하므로

SELECT D, count(created_at) AS total FROM 
(SELECT DATE_SUB(NOW(), INTERVAL D DAY) AS D 
    FROM 
    (SELECT 0 as D 
    UNION SELECT 1 
    UNION SELECT 2 
    UNION SELECT 3 
    UNION SELECT 4 
    UNION SELECT 5 
    UNION SELECT 6 
    ) AS D 
) AS D 
LEFT JOIN users ON date(created_at) = date(D) 
WHERE owner_id = ? or owner_id is null 
GROUP BY D 
ORDER BY D DESC 

나는 손에서 테이블 구조가 없습니다. 동일한 아이디어 순서로 참조 할 날짜는 NOW()입니다. 그러나 그것은 쉽게 조절할 수 있습니다. 어쨌든 그

http://sqlfiddle.com/#!2/ab5cf/11

+0

이것은 완벽한 감사입니다 –

+0

내 WHERE 조건에 추가 할 때 작동하지 않는 것 같습니다. –

관련 문제