2013-07-30 4 views
2

좋아요, 그래서 홈 시어터 시스템에서 일하고 있고 TV 시리즈 목록을 표시하기 위해 첫 번째 시즌의 첫 번째 에피소드를 선택하고 그 에피소드에 대한 관련 정보를 표시했습니다. 그런 다음 다른 사람들에게 드릴 다운 할 수 있습니다.MYSQL MIN in WHERE 절

그런 식으로 모든 영화와 모든 TV 프로그램을 단일 테이블에 보관하여 재생 기능을 훨씬 쉽게 유지할 수 있습니다.

문제는 일부 시리즈의 경우 데이터베이스에 첫 번째 에피소드가 없기 때문에 문제가 발생하지 않기 때문에 첫 번째 에피소드 대신 최소 시즌/시리즈를 선택하고 싶습니다.

, 나는 그것이 하나의 시리즈를 선택으로 다음 SELECT 절에 MIN을 넣을 수없고, 그것 때문에 그들이 그룹화하고있는 방법의 하나 개의 요소 말한다 때문에이 WHERE 절에 LEAST을 넣을 수 없으며, 나는 LIMIT을 사용할 수 없다. 왜냐하면 다시 한 번 시리즈를 선택하기 때문이다.

여러 개의 복잡한 하위 쿼리를 사용하지 않고이를 수행 할 수있는 방법이 있습니까? 여기

내가 지금 사용하고 쿼리의의 CASE 절은 적절한 알파벳 순서에 대한 일련의 타이틀에서 A//는을 제거하는 것입니다 :

SELECT *, CASE when substring(series,1,4) = 'The ' then substring(series, 5) 
       when substring(series,1,3) = 'An ' then substring(series, 4) 
       when substring(series,1,2) = 'A ' then substring(series, 3) 
       else series END AS sorttitle 
FROM Theater.Videos WHERE type='TV' and season=1 and episode=1 ORDER BY sorttitle ASC 

그리고 여기에 내가 원하는 본질적이다 :

SELECT *, CASE when substring(series,1,4) = 'The ' then substring(series, 5) 
       when substring(series,1,3) = 'An ' then substring(series, 4) 
       when substring(series,1,2) = 'A ' then substring(series, 3) 
       else series END AS sorttitle 
FROM Theater.Videos WHERE type='TV' and season=MIN(season) and episode=MIN(episode) ORDER BY sorttitle ASC 
+0

예상 결과와 함께 샘플 데이터를 제공 할 수 있습니까? – Verma

+0

테이블 레이아웃은 두 번째 대답에 대한 응답으로 아래에 있습니다. 여기에 나와있는 600 문자는 샘플 데이터를 입력하기에 충분하지 않지만 본질적으로 시즌 및 에피소드를 제외한 모든 열에서 동일한 데이터를 가진 결과를 얻을 수 있습니다. 시리즈/시즌/에피소드를 결합하면 고유하지만, 지금 당장 제약 조건을 설정하지 않았습니다. 또한 해당 필드는 유형이! = 'tv'인 경우에만 null이 될 것으로 예상되지만 적용되지는 않습니다 (가능하지는 않습니다). 이러한 제약 조건은 모두 응용 프로그램에 의해 적용되므로 데이터가 충족됩니다 테이블 레이아웃 –

+0

1. 시리즈의 각 시즌의 첫 번째 에피소드 또는 시리즈의 첫 번째 시즌의 첫 번째 에피소드를보고 싶습니까? – Verma

답변

1

select distinct v1.* 
from videos v1, 
    (select series, min(season) as min_season from videos group by series) as v2, 
    (select series, season, min(episode) as min_episode from videos group by series, season) as v3 
where v1.series = v2.series 
and v1.season = v2.min_season 
and v2.series = v3.series 
and v2.min_season = v3.season 
and v1.episode = v3.min_episode 

얻으려면 ...

이 첫 번째 (분) 시즌 사용의 첫 번째 에피소드와 함께 모든 시리즈의 목록을 얻으려면 (적절한 수정 후) 이러한 쿼리를 시도 각 시즌의 첫 번째 에피소드와 함께 모든 시리즈의 목록은 다음을 사용합니다 ...

select distinct v1.* 
from videos v1, 
    (select series, season, min(episode) as min_episode from videos group by series, season) as v3 
where v1.series = v3.series 
and v1.season = v3.season 
and v1.episode = v3.min_episode 
1

당신은 MIN()와 하위 쿼리를 사용하여 자신에게 표를 JOIN 수 있습니다 -이 가까이 있어야 :

SELECT V.*, CASE when substring(V.series,1,4) = 'The ' then substring(V.series, 5) 
       when substring(V.series,1,3) = 'An ' then substring(V.series, 4) 
       when substring(V.series,1,2) = 'A ' then substring(V.series, 3) 
       else V.series END AS sorttitle 
FROM Theater.Videos V 
    JOIN (
     SELECT series, Min(season) MinSeason, MIN(Episode) MinEpisode 
     FROM Theater.Videos 
     GROUP BY series 
    ) t ON t.series = V.series 
     AND t.season = V.MinSeason 
     AND t.episode = V.MinEpisode 
WHERE V.type='TV' 
ORDER BY V.sorttitle ASC 
0

그 DB 구조가 보이지 않는 무언가를 말하는 것이 어렵습니다. db 테이블의 샘플 개요를 입력하십시오.
또는 변수에 where 조건 부분을 할당하고 첫 번째 에피소드가없는 시리즈를 확인하고 while 루프를 사용하여 결과를 가져옵니다. while의 끝 후에 당신의 논리에 따라 다음 조건을 실행합니다.

+0

'동영상'이없는 경우 ( 'id'의 INT (11) NOT NULL AUTO_INCREMENT, 'file'의 VARCHAR (512) NULL NOT, 'type'의 VARCHAR (16) NULL NOT, 'series'의 VARCHAR (64) 초기 NULL, 'season'의 INT (2) DEFAULT NULL, 'episode' int (2) DEFAULT NULL, 'name' varchar (64) NOT NULL, 'year' int (11) DEFAULT NULL, 'genre' varchar (64) DEFAULT NULL, 'image' varchar (128) DEFAULT NULL, 'synopsis' 텍스트, 'opsopsis_ful l' 텍스트 NULL NOT, 'imdb_url'의 VARCHAR (128) NOT NULL로, 'imdb_id'의 VARCHAR (32) NULL NOT, PRIMARY KEY ('id'), UNIQUE KEY'file' ('file') ) ENGINE = InnoDB DEFAULT CHARSET = latin1; –