어떻게 데이터를 얻기 위해서 다시 Mysql 에 대한 일이 없는 통계

StackOverflow https://stackoverflow.com/questions/614739

  •  03-07-2019
  •  | 
  •  

문제

고 싶을 얻을 수의 등록에서 다시 기간(예를 들어 주),는 어렵지 않지만,나는지 궁금했을 경우 그것은 어쨌든 가능 MySQL 에서 반환하 제한하는 일이 없 등록한다.

예를 들어:데이터:

ID_Profile    datCreate
1   2009-02-25 16:45:58
2   2009-02-25 16:45:58
3   2009-02-25 16:45:58
4   2009-02-26 10:23:39
5   2009-02-27 15:07:56
6   2009-03-05 11:57:30

SQL:

    SELECT 
        DAY(datCreate) as RegistrationDate, 
    COUNT(ID_Profile) as NumberOfRegistrations 
    FROM tbl_profile
    WHERE DATE(datCreate) > DATE_SUB(CURDATE(),INTERVAL 9 DAY)
    GROUP BY RegistrationDate
    ORDER BY datCreate ASC;

이 경우에는 결과가 될 것이다:

RegistrationDate    NumberOfRegistrations
25  3
26  1
27  1
5   1

분명히 내가 누락 몇 일 사이입니다.현재 저는 이에 내 php 코드,하지만 내가 궁금하는 경우 MySQL 는 어떤 방법을 자동으로 0 을 반환한 일/의 행이 있습니다.이 것이 원하는 결과:

RegistrationDate    NumberOfRegistrations
25  3
26  1
27  1
28      0
1       0
2       0
3       0
4       0
5   1

이 방법은 우리가 사용할 수 있습니다 MySQL 문제를 해결하기 위해 수에 관한 일에 달하는 대신 php 의 코드를 계산하는 각 개월이 얼마나 많은 일이 있기 때문 MySQL 는 이 기능을 구축합니다.

사전에 감사합니다

도움이 되었습니까?

해결책

아니,그러나 하나의 문제를 해결할 수 있을 만들의 단 열이 테이블에 날짜가 기본 키로 날짜를 하였습니다.당신이 날짜가에서 초기 시작 지점을 통해 바로 일부는 멀리 떨어져 미래입니다.

지금,당신은 왼쪽 가입 통계 데이터에 대하여-그것을 당신을 얻을 것에 대해 널 그 일을 없는 데이터입니다.당신이 정말로 원하는 경우 제로 null 이 아닌 사용 IFNULL(colname,0)

다른 팁

감사 Paul 딕슨 저는 해결책을 발견했다.에 관심있는 사람들을 어떻게 해결이 읽어:

첫 번째 만들기 저장 프로시저는 내가 발견 어딘가에 채워 테이블과 함께 모든 날짜 올해합니다.

CREATE Table calendar(dt date not null);

CREATE PROCEDURE sp_calendar(IN start_date DATE, IN end_date DATE, OUT result_text TEXT)
  BEGIN
    SET @begin = 'INSERT INTO calendar(dt) VALUES ';
    SET @date = start_date;
    SET @max = SUBDATE(end_date, INTERVAL 1 DAY);
    SET @temp = '';
    REPEAT
      SET @temp = concat(@temp, '(''', @date, '''), ');
      SET @date = ADDDATE(@date, INTERVAL 1 DAY);
      UNTIL @date > @max
    END REPEAT;
    SET @temp = concat(@temp, '(''', @date, ''')');
    SET result_text = concat(@begin, @temp);
  END


   call sp_calendar('2009-01-01', '2010-01-01', @z);

   select @z;

다음 변경하는 쿼리를 추가하는 왼쪽에 참:

SELECT
    DAY(dt) as RegistrationDate,
    COUNT(ID_Profile) as NumberOfRegistrations
FROM calendar
LEFT JOIN 
    tbl_profile ON calendar.dt = tbl_profile.datCreate
WHERE dt  BETWEEN DATE_SUB(CURDATE(),INTERVAL 6 DAY)  AND CURDATE()
GROUP BY RegistrationDate
ORDER BY dt ASC

그리고 우리 모두 끝났습니다.

감사합니다 모두에 대한 빠른 응답과 솔루션입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top