2016-01-18 101 views
0

我有问题。我有3个表,一个带有视频列表,另一个带有类别列表,第三个表告诉我每个视频的分类。 我想列出所有类别,但我需要使用最后一个的缩略图插入每个类别的视频。 该列表必须显示该类别的名称以及插入该类别的最后一个视频的缩略图。我希望我明确自己。SQL选择3个表

  • Videos(Id, Name, Description, Duration, Date, Thumbnail, Active)
  • Categories(Id, Cat, Active)
  • VidCat(Id, Video, Cat)

我试图用表达波纹管,但不起作用。它显示了我所有的缩略图。

SELECT DISTINCT C.[Id], C.Cat, V.[Codigo] 
FROM [Categories] AS C 
left JOIN [VidCat] AS VC ON C.[Id] = VC.[Cat] 
left JOIN [Videos] AS V ON VC.[Video] = V.[Id] 
WHERE (C.[Active] = 1) 

也试过这个,但是是相同的结果。

SELECT DISTINCT C.[Id], C.Cat, V.[Thumbnail] 
FROM [Categories] AS C 
left JOIN [VidCat] AS VC ON C.[Id] = VC.[Cat] 
left JOIN [Videos] AS V ON VC.[Video] = V.[Id] 
WHERE (C.[Active] = 1) 
AND (V.[Thumbnail] IN (SELECT distinct [Thumbnail] FROM [Videos] WHERE VC.[Video] = [Id] ORDER BY [Date] DESC)) 
ORDER BY P.[Id] 

非常感谢。

贝托

+0

将'V. [Thumbnail]'条件从'WHERE'移动到'ON'以获得真正的'LEFT JOIN'行为,因为它现在可以得到常规的内部连接结果。 – jarlh

+0

另外,不需要在子查询中选择“DISTINCT”。 – jarlh

回答

0

您可以使用相关子查询或outer apply用于此目的:

select c.*, v.* 
from categories c outer apply 
    (select top 1 v.* 
     from vidcat vc join 
      videos v 
      on vc.video = v.id 
     where vc.cat = c.id 
     order by v.date desc 
    ) v; 

虽然这可以使用join S和其它SQL结构(如row_number())来表述,这可能是最简单和最快速的方法 - 特别是正确的索引。

+0

谢谢,完美的工作。 – Humberto