2012-11-07 37 views
1

此問題與this one類似,但有所不同:我有八種不同類型的標籤。根據多個標準查找相關文章

事情是這樣的:

videos  [id, title] 
tags1  [id, tag] 
tags2  [id, tag] 
tags3  [id, tag] 
tags4  [id, tag] 
tags5  [id, tag] 
tags6  [id, tag] 
tags7  [id, tag] 
tags8  [id, tag] 
video_tags1 [vid_id, tag_id] 
video_tags2 [vid_id, tag_id] 
video_tags3 [vid_id, tag_id] 
video_tags4 [vid_id, tag_id] 
video_tags5 [vid_id, tag_id] 
video_tags6 [vid_id, tag_id] 
video_tags7 [vid_id, tag_id] 
video_tags8 [vid_id, tag_id] 

給定一個video.id我想在此基礎上挑選出相關視頻具有共同的最標籤。我發現很難找到一種方法來做到這一點,更不用說一種不會讓服務器陷入困境的方式。

+0

我已經發布了一個解決方案,但也許可以簡化很多。 'tag'包含什麼?只有一個描述?所以也許我可以檢查'tag_id'是否等於,並且不需要加入'tags'表。 – fthiella

+0

是標籤包含一個簡短的字符串 - 加入標籤表是不必要的。 –

+0

好的,我會編輯我的答案! – fthiella

回答

2

如果您可以更改數據庫模型,那麼這些建議可能適合您。

重新定義你的表這種方式:

videos  [id, title] 
tags [id, tag_type,tag] 
videos_tags [vid_id, tag_id] 

你還可以添加一個TAG_TYPE表(這將有8行,每一個yourtag類型)爲更多的一致性。

那麼這個查詢(它可能有一些語法錯誤,但我的本意是,你的想法)會給你的視頻ID和匹配標籤與所提供的一個數字:

select 
     videos.id, count(videos.id) as nEqualTags 
from 
     videos videos inner join video_tags vtags on (vtags.vid_id=videos.id) 
where 
     vtags.tag_id in (select tag_id from videos_tags where vt.id = ?) 
group by 
     videos.id 
order by 
     nEqualTags desc 

你如果nEqualTags低於某個值,可能會添加更多邏輯以減少結果。

(也考慮增加一些索引以獲得更好的性能)。

希望它可以幫助

+0

我可以改變結構。不知道爲什麼我沒有想到這個開始......謝謝! –

+0

不知道它會有什麼表現。如果您不介意,請在測試時更新,因爲我很好奇它。 – richardtz

+0

0.0137s,包含359個視頻記錄和1497個視頻標籤記錄。比我以前的CPU熔化怪物好得多!謝謝! –

1

我認爲它總是一個好主意,對標準化工作表中,在這種情況下,這個UNION查詢可以幫助:

(select 1 as tab, vid_id, tag_id from video_tags1 
union select 2 as tab, vid_id, tag_id from video_tags2 
union select 3 as tab, vid_id, tag_id from video_tags3 
...) 

現在你必須使用這樣的查詢:

SELECT 
    tags_1.vid_id, count(*) as common_tags 
FROM 
    (big union above) video_tags 
    INNER JOIN 
    (big union above) video_tags_1 
    ON video_tags.tab = video_tags_1.tab 
    AND video_tags.tags_id = video_tags_1.tags_id 
    AND video_tags.vid_id = 1 
    AND video_tags_1.vid_id <> 1 
GROUP BY video_tags_1.vid_id 
ORDER BY common_tags DESC 

這將按照它們共有的標記數返回所有按照DESC排序的記錄。這可能是一個如何進行的想法。您應該添加一個JOIN以獲取視頻的標題。 如果您還需要獲取他們共有的標籤的描述...以及可能,但我認爲這會使查詢複雜化很多!

你確定你不能改變你的數據庫模型,只使用一個表格標籤,一個用於視頻標籤?它會讓事情變得更容易!