2008-12-20 50 views
9

那麼我運行一個小視頻網站,在實際的視頻頁面上有一條類似於大多數視頻方面(如YouTube)的「相關視頻」和目前我所做的只是隨機取出其中的一個標籤,並找到具有相同標籤的其他視頻。毫不奇怪,這不是一個好方法,因爲一些標籤非常模糊,一些視頻被錯誤標記。當前查詢的在標記視頻系統上尋找「相關視頻」查詢的建議

實施例:

SELECT video_name FROM videos INNER JOIN videotags ON videos.id=videotags.video_id INNER JOIN tags ON tags.id=videotags.tag_id WHERE tag_name='x' AND videos.id<>'y' LIMIT 5 

其中x是從當前視頻和y的標籤中的任一個是從當前視頻的ID。 (參考我使用的參數化查詢不用擔心)

我只是好奇你們如何處理這個問題,也許最好是合併類似的視頻標題?

這裏是我的數據庫表中如何設置:

VIDEOS TABLE 
------------ 
video_id [PK,auto_increment] int(11) 
video_name varchar(255) 

TAGS TABLE 
---------- 
tag_id [PK,auto_increment] int(11) 
tag_name varchar(255) 

VIDEOTAGS TABLE 
--------------- 
tag_id [PK,FK] int(11) 
video_id [PK,FK] int(11) 

有明顯的視頻表的詳細列但這恰恰說明了具有自動遞增的主鍵兩側

簡單許多一對多的關係

該網站是建立在PHP與MySQL數據庫,但其實並不重要:)

編輯:還有的是要去一個有機的路線等等一些演講中,我的身影我會發布我的其他兩個與視頻觀看和視頻評級相關的半相關表格。現在請注意,我沒有特別增加更多的列,因爲隱私問題的視頻意見表的打算(是的,我知道我存儲在評級表IPS)

VIDEOVIEWS TABLE 
---------------- 
video_id [FK] int(11) 
view_time datetime 

VIDEORATINGS TABLE 
------------------ 
video_id [PK,FK] int(11) 
ip_address [PK] varchar(15) 
rating int(1) 
rate_time datetime 
+0

哈,謝謝我也這麼認爲^ -^ – 2008-12-20 19:38:35

回答

4

該查詢應該返回與您的視頻(v1)具有相同標籤的視頻(v2)的ID,按照相同標籤數量的降序排列。

SELECT v2.video_id 
FROM VideoTags AS v1 
    JOIN VideoTags AS v2 
    USING (tag_id) 
WHERE v1.video_id = ? 
    AND v1.video_id <> v2.video_id 
GROUP BY v2.video_id 
ORDER BY COUNT(*) DESC; 
1

非常有趣的問題。

這只是想大聲,但我能想到的一些選項有:

1)使用的所有變量 - 例如想象的有每個這段視頻確實標籤視頻列表查詢。製作一個視頻列表,按其出現的列表數量的順序排列,即與此視頻共有多少個標籤的計數。有更多共同標籤的人可能是「更相關的」。 (我並不是建議你在現實中做多個查詢,只是試圖解釋我腦海裏有什麼......有一個比我更好的SQL-fu的人可能會想出一個這樣的查詢。您還可以通過流行度或其他可能的信息進行訂購)。

2)嘗試使用一種讓相關視頻自然出現的算法,一個la amazon'買了這個的人也買了這個'。例如,如果您跟蹤誰查看了什麼內容,您可以設計一個查詢來生成這樣的列表。

+0

想法之一基本上是我在想什麼,但我不知道如何使這翻譯成SQL。就像你說的那樣,我的SQL-fu不夠強大 – 2008-12-20 20:08:41

+0

嗯,這是一個很好的問題......也許可以就這個特定的查詢提出想法作爲一個單獨的SQL問題,並將它鏈接到這個問題上?但我認爲值得保留這個問題,這是一個很好的問題。 – frankodwyer 2008-12-20 20:43:13