2016-01-18 48 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