2013-07-30 216 views
2

好的,所以我正在研究家庭影院系統,並顯示電視劇列表我一直在選擇第一季的第一集並顯示相關信息,那麼你可以深入到其他人。MYSQL MIN WHERE子句

這樣我就可以將所有電影和所有電視節目保存在一張表中,這使播放功能變得更加簡單。

問題是,我沒有在數據庫中的第一集的一些系列,我希望他們無論如何出現,所以我想選擇最低季節/系列而不是第一個。

我不能把MIN SELECT子句中的那麼只選擇一個系列,我不能把LEASTWHERE子句中,因爲它說,這是因爲他們分組的方式只有一個元素,並我不能使用LIMIT,因爲它再次只會選擇一個系列。

有沒有辦法做到這一點沒有多個複雜的子查詢?

下面是我用此刻的查詢中,CASE條款是從一系列的標題刪除/ AN /的正確字母順序:

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結構的東西。如果你可以請把你的數據庫表的示例概述。
或將where條件部分指定給變量,並首先檢查沒有第一集的系列,並使用while循環獲取結果。根據你的邏輯結束後執行下一個條件。

+0

CREATE TABLE IF NOT EXISTS'Videos'( 'id' INT(11)NOT NULL AUTO_INCREMENT, 'file' VARCHAR(512)NOT NULL, 'type' VARCHAR(16)NOT NULL, 'series' VARCHAR(64)DEFAULT 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'文本, 'synopsis_ful l'文本NOT NULL, 'imdb_url' VARCHAR(128)NOT NULL, 'imdb_id' VARCHAR(32)NOT NULL, PRIMARY KEY('id') UNIQUE KEY'file'('file') ) ENGINE = InnoDB DEFAULT CHARSET = latin1; –