2017-03-21 54 views
-1

尝试环绕此查询我的头,但这里是......SQL SELECT查询组由带有密码(加入或子查询)

表:TVEpisode
列:TVEpisodeID(PK),TVSeriesID,季节(编号),看过(0或1)

我期待得到的是每个TVSeries的第一个未观看(值为0)的剧集。例如,如果我看过的所有的季节1的TVSeriesID(45)和我持续关注事件是第2季第5集,我想查询返回:

TVEpisodeID | TVSeriesID | Season | Episode 
PK   | 45   | 2  | 6 

极品导致每个TVSeries

+2

添加一些示例表格数据和预期结果 - 以及格式化文本。同时向我们展示您当前的查询尝试。 – jarlh

+2

请告诉我们您正在使用的数据库(MySQL,SQL Server等)。 –

+0

数据库是SQL Server。 – clarkes71

回答

4

的第一watched=0在大多数数据库中,您将与ANSI标准窗口功能做到这一点:

select tve.* 
from (select tve.* 
      row_number() over (partition by tvseriesid order by season, episode) as seqnum 
     from tvepisode tve 
     where tve.watched = 0 
    ) tve 
where seqnum = 1; 

我假设“第一个”是指seasonepisode的组合。

0

这应该给你所有的季节/插曲组合

SELECT * 
FROM TVEpisode 
WHERE TVEpisodeID IN 
    (SELECT min(TVEpisodeID) 
    FROM TVEpisode 
    WHERE watched=0 
    GROUP BY TVSeriesID) t 
+0

这将在sql服务器(也可能是其他数据库)中失败,因为您在选择列表中没有出现在group by子句中的列。 –

+0

噢。谢谢,我在内部查询中无论如何都不需要这些列。这就是为什么我使用外部查询 – Utsav

+0

这假设TVEpisodeID具有相同的季节和情节组合的值的顺序。这在查询中没有提及。 –