2013-07-15 82 views
-1

我正在使用YouTube風格的網站,並且在您正在觀看的視頻下方,我必須放置相關視頻,而且我無法執行mysql查詢,所以我認爲您可以提供幫助我。 搜索必須根據標籤和類別返回相似的視頻(抱歉,如果我寫錯了,英語不是我的母語),因此在兩個標籤和類別中都有更多匹配的視頻位於頂部。 我的表是高級相關視頻搜索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

假設我理解你的問題,這應該返回所有的視頻,那些在貓和標籤表中的最匹配的排序:

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 
+0

非常感謝你sgeddes! – user1342980

+0

@ user1342980 - np,很高興能幫到你! – sgeddes