高级相关视频搜索mysql

时间:2013-07-15 00:16:34

标签: mysql sql

我正在开发一个youtube风格的网站,在你正在观看的视频下面,我必须放相关视频,我不能做mysql查询,所以我认为你可以帮助我。 搜索必须返回基于标签和类别的类似视频(对不起,如果我写错了,英语不是我的母语),所以标签和类别中有更多匹配的视频位于顶部。 我的桌子是

“视频”
VIDEO_ID(INT) USER_ID(INT) 标题(VARCHAR)

“VIDEO_CATS”
CAT_ID(INT) 类别(VARCHAR) VIDEO_ID(INT)

“VIDEO_TAGS”
TAG_ID(INT) 标签(VARCHAR) VIDEO_ID(INT)

我需要的结果必须是这样或类似的(返回3行的例子): (相关视频到VIDEO_ID = 1234)

VIDEO_ID     TITLE           MATCHES
345          myvideo         12
584          examplename1    4
432          othername       2
124          name4           0             

哦!如果有可能,我需要,如果没有匹配,查询仍然返回值,就像上面的例子。

1 个答案:

答案 0 :(得分:0)

假设我理解你的问题,这应该可以返回所有视频,由猫和标签表中匹配最多的人订购:

SELECT V.Video_Id, 
    V.Title, 
    COUNT(DISTINCT Cat_Id) + COUNT(DISTINCT Tag_Id) Matches
FROM Videos V
  LEFT JOIN Video_Cats VC ON VC.Video_Id = V.Video_Id
    AND VC.Cat_ID IN (SELECT Cat_Id FROM Video_Cats WHERE Video_Id = 1234)
  LEFT JOIN Video_Tags VT ON VT.Video_Id = V.Video_Id
    AND VT.Tag_ID IN (SELECT Tag_Id FROM Video_Tags WHERE Video_Id = 1234)
WHERE V.Video_Id <> 1234
GROUP BY V.Video_Id
ORDER BY 3 DESC

或者这可能会产生更好的效果,而不是使用IN,而是与JOINs结合使用:

SELECT V.Video_Id, 
  V.Title, 
  COUNT(DISTINCT VC2.Cat_Id) + COUNT(DISTINCT VT2.Tag_Id) Matches
FROM Videos V
  LEFT JOIN Video_Cats VC1 ON VC1.Video_Id = 1234
  LEFT JOIN Video_Cats VC2 ON VC2.Video_Id = V.Video_Id AND VC1.Cat_Id = VC2.Cat_Id
  LEFT JOIN Video_Tags VT1 ON VT1.Video_Id = 1234
  LEFT JOIN Video_Tags VT2 ON VT2.Video_Id = V.Video_Id AND VT1.Tag_Id = VT2.Tag_Id
WHERE V.Video_Id <> 1234
GROUP BY V.Video_Id
ORDER BY 3 DESC