2013-06-03 3 views
0

내 영화 데이터베이스는 사용자가이처럼 보이는 세션 테이블에 데이터베이스를 입력 할 수 있습니다 날짜 :그룹 영화 세션으로는

id | time | movie_id 
시간은 동영상이 재생 및 movie_id가 관련된 핵심 될 날짜입니다

영화 테이블.

이제 영화가 재생되는 연속적인 요일을 찾으려고합니다. 예를 들어 표시 할 수 있기를 원합니다.

3/6/2013 - 7/6/2013 
Iron Man 3 7pm 
Second Movie 10pm 
ETC... 

8/6/2013 
Iron Man 3 8pm 

9/6/2013 - 11/6/2013 
Iron Man 3 7pm 
Second Movie 10pm 

연속적으로 시간을 사용하여 그룹화 할 수 있습니까? 필요한 경우 테이블을 별도의 날짜 및 시간 값으로 변경할 수 있습니다. 어떤 도움이라도 대단히 감사 할 것입니다. 이것이 PHP에서만 가능하다면 시작하는 방법에 대한 아이디어도 환영 할 것입니다.

감사합니다. 질문이 있거나이 질문이 명확하지 않으면 질문하십시오.

+0

예, SQL에서보다 PHP에서 더 쉽게 할 수 있습니다. 'time, movie_id'로 영화를 주문하고 다음 날에 도착할 때까지 모두 선택하고 어제의 결과와 결과를 비교하십시오. 동일한 경우 무시하십시오. 동일하지 않은 경우 어제를 종료일로 설정하고 오늘을 새 범위의 시작일로 설정하십시오. 그게 의미가 있다면 : –

+0

@ JoachimIsaksson 나는 그것에 대해 생각하고 있었다. 하지만 이는 PHP가 거대한 데이터 세트를 정렬 할 수 있음을 의미합니다. – MichaelH

+0

페이지를 가져 오는 데 필요한 데이터에 대한 시작일/종료일과 같은 다른 제한 사항이 있습니까? –

답변

1

글쎄, 그렇게 우아하지는 않지만, GROUP_CONCAT 집합 함수와 변수를 사용하여 비슷한 연속 일 그룹을 SELECT 그룹으로 묶어보십시오.

스키마 및 예 데이터 설정 :

CREATE TABLE movies (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    title CHAR(64) NOT NULL 
); 
CREATE TABLE schedule (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    time TIMESTAMP NOT NULL, 
    movie_id INT NOT NULL 
); 
INSERT INTO movies (title) VALUES 
    ('Iron Man 3'), 
    ('Second Movie') 
; 
INSERT INTO schedule (time, movie_id) VALUES 
    ('2013-06-03 19:00:00', 1), 
    ('2013-06-03 22:00:00', 2), 
    ('2013-06-04 19:00:00', 1), 
    ('2013-06-04 22:00:00', 2), 
    ('2013-06-05 19:00:00', 1), 
    ('2013-06-05 22:00:00', 2), 
    ('2013-06-06 19:00:00', 1), 
    ('2013-06-06 22:00:00', 2), 
    ('2013-06-07 19:00:00', 1), 
    ('2013-06-07 22:00:00', 2), 
    ('2013-06-08 20:00:00', 1), 
    ('2013-06-09 19:00:00', 1), 
    ('2013-06-09 22:00:00', 2), 
    ('2013-06-10 19:00:00', 1), 
    ('2013-06-10 22:00:00', 2), 
    ('2013-06-11 19:00:00', 1), 
    ('2013-06-11 22:00:00', 2), 
    ('2013-06-13 19:00:00', 1), 
    ('2013-06-13 22:00:00', 2) 
; 

쿼리 :

SELECT 
    DATE_FORMAT(min_date, '%e/%c/%Y') AS beg_date, 
    DATE_FORMAT(max_date, '%e/%c/%Y') AS end_date, 
    title, 
    LOWER(TIME_FORMAT(time, '%l%p')) AS `movie_time` 
    FROM 
    (SELECT 
     MIN(min_date) AS min_date, 
     MAX(max_date) AS max_date, 
     range_schedule 
     FROM 
     (SELECT 
      @min_date := 
       IF(@range_schedule <=> day_schedule 
       AND days.date <=> ADDDATE(@max_date, 1), 
       @min_date, 
       days.date 
      ) AS min_date, 
      @max_date := days.date AS max_date, 
      @range_schedule := days.day_schedule AS range_schedule 
      FROM 
      (
       SELECT DATE(time) AS `date`, GROUP_CONCAT(CONCAT(TIME(time), '-', movie_id) ORDER BY time) AS day_schedule 
       FROM schedule 
       GROUP BY DATE(time) 
       ORDER BY DATE(time) 
      ) AS days, 
      (SELECT 
       @min_date := '0000-00-00', 
       @max_date := '0000-00-00', 
       @range_schedule := NULL 
      ) r 
     ) days_of_ranges 
     GROUP BY min_date, range_schedule 
    ) ranges 
    JOIN schedule ON DATE(schedule.time) = ranges.min_date 
    JOIN movies ON movies.id = movie_id 
    ORDER BY min_date, time 
; 

그리고 결과 :

| BEG_DATE | END_DATE |  TITLE | MOVIE_TIME | 
----------------------------------------------------- 
| 3/6/2013 | 7/6/2013 | Iron Man 3 |  7pm | 
| 3/6/2013 | 7/6/2013 | Second Movie |  10pm | 
| 8/6/2013 | 8/6/2013 | Iron Man 3 |  8pm | 
| 9/6/2013 | 11/6/2013 | Iron Man 3 |  7pm | 
| 9/6/2013 | 11/6/2013 | Second Movie |  10pm | 
| 13/6/2013 | 13/6/2013 | Iron Man 3 |  7pm | 
| 13/6/2013 | 13/6/2013 | Second Movie |  10pm | 

당신이 PHP에서 할 필요가있는 모든 저장하는 것입니다 마지막으로 BEG_DATEEND_DATE 값을 사용하여 현재 값과 비교하여 출력시기를 결정하십시오. 범위 헤더.

+0

완벽하게 작동하는 것 같습니다. 단점을 인식하지 못하는 경우는 예외입니다. 예를 들어 제가 데이타베이스에 가지고있는 유일한 것은 3AM, 12AM, 20AM에 3 인의 아이언 맨 영화가 있다면 시작일은 3 일, 종료일은 20 일입니다. 3 가지 옵션을 반환하는 것이 아닙니다. – MichaelH

+0

흠, 정말로. 그것을 수정했습니다. – Olexa