2009-11-28 45 views
1

所以,首先這裏是有關表結構:需要幫忙寫一個MySQL查詢相關視頻

TUBE_VIDEOS 
------ 
id 
video_name 

TAGS 
---- 
id 
tag_name 
tag_type [either set to "actor" or "tag"] 

TUBE_VIDEO_TAGS 
---- 
tube_video_id 
tag_id 

我曾問一個問題,而回有關如何使用這些數據來獲得相關視頻:here - - 這個解決方案基本上採用了最常見的相似標籤來決定哪些是最相似的視頻。從那時起我的數據庫被修改了一下,以顯示標籤描述的內容。因此,例如「Tom Cruise」設置爲tag_type「actor」,而「爆炸」設置爲tag_type「tag」。我想要做的是調整查詢來衡量比標籤重的演員。所以基本上我們會對MySQL說:給我一個帶有最匹配演員的視頻ID列表,如果聯繫使用下一個最匹配的標籤。

回答

3

你可以用很多連接來做到這一點。以下查詢從當前視頻tv開始。它會查找屬於該視頻tvt的所有標籤。然後它會查找所有其他視頻的共享一個或多個標籤rtvt。對於相關視頻,它會查找標籤詳情rt和視頻詳情rtv

select  rtv.video_name 
,   sum(case when rt.tag_type = 'actor' then 1 else 0 end) ActorCount 
,   sum(case when rt.tag_type = 'tag' then 1 else 0 end) TagCount 
from  tube_videos tv 
left join tube_video_tags tvt 
on   tvt.tube_video_id = tv.id 
left join tube_video_tags rtvt 
on   rtvt.tag_id = tvt.tag_id 
and   rtvt.tube_video_id <> tv.id 
left join tags rt 
on   rt.id = rtvt.tag_id 
left join tube_videos rtv 
on   rtv.id = rtvt.tube_video_id 
where  tv.id = <YourMovieId> 
group by rtv.id, rtv.video_name 
order by ActorCount desc, TagCount desc 

在所有連接之後,您可以計算各種徽章類型並按順序排列。

+0

真棒,謝謝你。你在我修正的where子句中做了一個小的拼寫錯誤,所以我只能給你99%的任務:) – 2009-11-28 20:38:52