-2

我正在开发一个 youtube 风格的网站,在您正在观看的视频下方,我必须放置相关视频,而且我无法进行 mysql 查询,所以我想你可以帮助我。搜索必须根据标签和类别返回相似的视频(对不起,如果我写错了,英语不是我的母语),因此在标签和类别中具有更多匹配的视频位于顶部。我的桌子是

"VIDEOS"
video_id(int) user_id(int) title(varchar)

"VIDEO_CATS"
cat_id(int) 类别(varchar) video_id(int)

"VIDEO_TAGS"
tag_id(int) tag(varchar) video_id(int)

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

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

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

4

1 回答 1

1

假设我理解您的问题,这应该可以返回所有视频,按猫和标签表中匹配最多的视频排序:

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
于 2013-07-15T00:54:08.390 回答