2017-10-23 13 views
2

Ich habe die folgende Tabellenstruktur:Wie bekomme ich die letzte Episode jeder Serie in MySQL?

id | series_id | season | episode 

Die Tabelle stellt eine TV zeigt Episoden.

Ich möchte die letzte Episode von jeder Serie_id abrufen.

Beispiel:

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

Gewünschtes Ergebnis:

series_id | season | episode 
    1   2   1 
    2   1   2 

Ich habe versucht, die folgende Abfrage, die nicht, wahrscheinlich nicht funktionieren, weil es Gruppen es zuerst, dann die Ergebnisse bestellt.

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

Antwort

2

Unter der Annahme, dass es ein vernünftiger max auf der Anzahl der Episoden pro Saison (sagen sie, nicht mehr als 1000 Folgen) Sie einen wenig mathematischen Trick verwenden:

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

Die Idee ist, einen Wert zu konstruieren, bei dem die inkrementierende season Nummer Vorrang vor der höchsten episode der vorherigen Saison hat, und diese Nummern an die MAX zur Auswahl geben. In Ihrem Beispiel wäre die zusammengesetzten Zahlen wie folgt:

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 

Sobald wir unsere max haben wir die Anzahl der Tausende als Saison, und den Rest als Folge Nummer verwenden.

+0

Brilliante Lösung, danke! – HtmHell

1

Verwenden Sie nicht group by. Sie möchten einen Filter. Hier ist eine Methode:

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

Danke, das funktioniert super, aber die Lösung von @dasblinkenlight funktioniert schneller. – HtmHell

+0

Versuchen Sie, einen Index für Episoden (Serien, Staffeln, Episoden) zu erstellen. –

0

versuchen diese

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

Arbeitsprobe here

+0

Das wird nur die höchste Staffel und Episode für jede Serie ausgeben, aber das ist nicht was ich will. Sagen wir "S02E01" ist die letzte Episode, aber da ist 'S01E22' Ich möchte, dass das Ergebnis' S02E01' ist und nicht 'S02E22'. – HtmHell

+0

Ich stimme zu, aber wie in Ihrer Frage gezeigt wird, dass alle Spalten Integer sind, so in diesem Fall wird das funktionieren, aber wenn Werte sind Varchar dann würde das nicht funktionieren wie erwartet – Saif

+1

Sie sind in der Tat ganze Zahlen, ich schrieb es so für die Bequemlichkeit. Sie können dies sogar in Ihrem Beispiel sehen: Für 'series_id' 1 erhalten Sie Staffel 2 und Folge 9, obwohl diese Episode nicht existiert. – HtmHell

0

Sie Rank verwenden können, führt zu einem Satz und der Filter auf Ihrem Rang zu definieren.

SELECT X.* FROM 
(Select *, DENSE_RANK() OVER (PARATITION BY ID ORDER BY EPISODE DESC)AS RNK 
) AS X 
WHERE X.RNK = 1 
Verwandte Themen