2017-10-23 4 views
2

私は次の表の構造を持っている:MySQLの各シリーズの最後のエピソードを取得するには?

id | series_id | season | episode 

の表は、テレビのエピソードを示して表しています。

各series_idの最後のエピソードを取得します。

例:

id | series_id | season | episode 
1  1   1   9 
2  1   2   1 
3  2   1   1 
4  2   1   2 

募集結果:

series_id | season | episode 
    1   2   1 
    2   1   2 

私はそれが最初に、その後、結果を順序付けおそらくそれのグループので、動作しません。次のクエリを試してみました。

SELECT  series_id, season, episode 
FROM  episodes 
GROUP BY series_id 
ORDER BY season DESC, episode DESC 

答えて

2

あなたは少し数学的なトリックを使用することができます(たとえば、1000のエピソードを超えない)、シーズンごとのエピソードの数の合理的な最大がありますと仮定すると::

SELECT 
    series_id 
, MAX(1000*season + episode)/1000 AS season 
, MAX(1000*season + episode)%1000 as episode 
FROM episodes 
GROUP BY series_id 

ここでの一つの方法です前のシーズンのepisodeよりも増加するseasonの数値を優先して値を設定し、これらの数値をMAXに与えて選択します。

id | series_id | season | episode | composite 
1  1   1   9   1009 
2  1   2   1   2001 
3  2   1   1   1001 
4  2   1   2   1002 

を我々はmaxは、我々はシーズン番号など数千人の数、およびエピソード番号などの残りの部分を使用していたら、次のようにあなたの例では合成数は次のようになります。

+0

素晴らしいソリューション、ありがとう! – HtmHell

1

group byを使用しないでください。フィルタが必要です。

select e.* 
from episodes e 
where (e.season, e.episode) = (select e2.season, e2.episode 
           from episodes e2 
           where e2.series = e.series 
           order by e2.season desc, e2.episode desc 
           limit 1 
          ); 
+0

ありがとうございます、それは素晴らしいですが、@ dasblinkenlightのソリューションはより速く動作しています。 – HtmHell

+0

「エピソード(シリーズ、シーズン、エピソード)」にインデックスを入れてみてください。 –

0

はあなたのランクにセットし、フィルターで結果を定義するためにRankを使用することができ、この

select series_id, max(season) as season, max(episode) as episode 
from your_table 
group by series_id 

ワーキングサンプルhere

+0

それは各シリーズの最高シーズンとエピソードを出力しますが、それは私が望むものではありません。 'S02E01'が最後のエピソードだとしましょうが、' S01E22'があります。その結果を 'S02E22'ではなく' S02E01'にしたいとしましょう。 – HtmHell

+0

私は同意しますが、あなたの質問に示されているように、すべての列が整数なので、これはうまくいきますが、値がvarcharの場合は期待通りに機能しません – Saif

+1

実際には整数です。あなたの例でもこれを見ることができます: 'series_id' 1ではシーズン2とエピソード9が得られますが、このエピソードは存在しません。 – HtmHell

0

を試してみてください。

SELECT X.* FROM 
(Select *, DENSE_RANK() OVER (PARATITION BY ID ORDER BY EPISODE DESC)AS RNK 
) AS X 
WHERE X.RNK = 1 
関連する問題