2014-09-25 1 views
1

나는이 구조와 테이블이 있습니다열 값을 기준으로 행을 반환하고 날짜별로 그룹화하는 방법은 무엇입니까?

영화 :

id | date_entered_theater | date_left_theater 

내가 하루에 극장에서 영화의 수를 반환하는 쿼리를 작성하고자합니다. date_entered_theater 열이 null이 아니고 date_left_theater 열이 null 인 경우 극장에 영화가 있습니다.

날짜 열은 datetime 형식을 사용하고 쿼리는 이와 같은 데이터를 반환해야합니다

date   moviesInTheater 
2014-09-22 | 5 
2014-09-23 | 6 
2014-09-24 | 8 
2014-09-25 | 7 

나는이 쿼리를 작성하는 방법 확실 해요. 나는 시도 다음 date_entered_theater 및하여 그룹은을 의미하는 계정으로 date_left_theater을하지 않기 때문에

그것은 오류가 발생
SELECT DATE(date_entered_theater), COUNT(*) as moviesInTheater 
FROM movies 
GROUP BY DATE(date_entered_theater) 
HAVING date_entered_theater IS NOT NULL AND date_left_theater IS NULL 
ORDER BY date_entered_theater ASC 

[Err] 1054 - Unknown column 'date_left_theater' in 'having clause'

나는 또한 위의 쿼리가 올바른 생각하지 않는다 영화가 극장에 입장하지 않는 날에는 영화가 극장을 떠날 수 있으며이 변경 사항은 결과 세트에 반영되지 않습니다.

MySQL에서 무엇을 할 수 있습니까?

+1

'date_entered_theater는 null가 아니고, date_left_theater는 NULL'가에 있어야입니다'WHERE'하지 HAVING''이다. – user2989408

+0

@ user2989408 필자가 작성한 조건은 선택한 조건의 날짜 범위에만 조건을 적용하려는 경우 해당 조건을 충족시키지 않는 행을 걸러 내기 때문에 실제로 완전히 잘못되었다고 생각합니다. – Nate

+0

그래서 특정 날짜에 영화의 수를 찾고 싶습니다. – user2989408

답변

2

조건부 검사는 WHERE이어야하며 HAVING이 아니어야합니다.
집계 함수를 기반으로하는 조건 만 HAVING 절에 있어야합니다.

SELECT DATE(date_entered_theater), COUNT(*) as moviesInTheater 
FROM movies 
WHERE date_entered_theater IS NOT NULL AND date_left_theater IS NULL 
GROUP BY DATE(date_entered_theater) 
ORDER BY date_entered_theater ASC 

편집 : 당신이 어떤 특정 날짜에 상영하는 영화의 번호를 확인해야하는 경우, 당신은 아래와 같은 뭔가를해야 할 수도 있습니다. 나는 시간이있을 때 나는 바이올린을 게시하려고 노력할 것이다.

SET @num = -1; 
SELECT 
    date_sequence, 
    COUNT(m.id) as moviesInTheater 
FROM movies as m 
    JOIN (SELECT DATE_ADD('2014-09-01', 
        interval @num := @num+1 day) AS date_sequence 
      HAVING DATE_ADD('2014-09-01', interval @num day) <= '2014-09-25') as dt 
     ON m.date_entered_theater >=dt. date_sequence 
GROUP BY dt.date_sequence 
1

먼저 한 열에 관심있는 시간대 (예 : 1 년)의 모든 일이 포함 된 표가 필요합니다. movies.date_entered_theater 란에 하루 종일 존재하는 보증이 없기 때문에 다른 테이블을 사용할 수 없습니다.

좋아하는 프로그래밍 언어를 사용하여 루프를 채울 수 있습니다.

이 테이블이 존재하고, 이름이 movies_daily이고 한 개의 열 day이 기본 키라고 가정 해 보겠습니다.

다음은 현재 날짜가 영화관에 입장 한 날짜와 극장을 나간 날짜 사이 인 경우 극장에 영화가 있습니다. 영화가 극장을 떠난 날짜가 null의 경우

영화가 극장에서 여전히 :

SELECT 
    movies_daily.day 
    , COUNT(*) AS moviesInTheater 
FROM 
    movies_daily 
    LEFT JOIN movies 
    ON movies_daily.day >= movies.date_entered_theater 
    AND (movies_daily.day < movies.date_left_theater 
     OR movies.date_left_theater IS NULL) 
GROUP BY 
    movies_daily.day 
ORDER BY 
    movies_daily.day 
+0

> 먼저 1 년 동안 적어도 하나의 열이있는 테이블이 필요합니다. 이유에 대해 설명해주십시오. – Gervs

+0

@Gervs 당신 말이 맞아요, 잘하면이 테이블의 필요성을 분명히했습니다. – psadac

+0

아니요. 쿼리에 필요한 것은 동적으로 생성 될 수있는 날짜 범위입니다. – Gervs

관련 문제