我正在开发一个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
哦!如果有可能,我需要,如果没有匹配,查询仍然返回值,就像上面的例子。
答案 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