2012-03-20 28 views
1

所以, 我想要一個SQL查詢,我可以強制有多個關聯 對象所以我想查詢他們有所有我對MYSQL如何確保多個關聯中

限制標籤的所有視頻因此,視頻必須有一個videos_tags是關聯它tags.id 1,2和3

到目前爲止,我試過

SELECT videos.*, tags_videos.tag_id, tags_videos.video_id FROM videos 
LEFT JOIN tags_videos ON tags_videos.video_id = videos.id 
WHERE tags_videos.tag_id IN (1,2,3) 

,但這似乎更or子句的不AND子句是存在的,獨家和IN ST atement?

此外,這是在積極的記錄Rails。有沒有一種方法可以通過Rails中的AR輕鬆實現?

繼承人什麼我已經試過

Video.all.select{|v| params[:tags].select{|t| v.tag_ids.include?(t.to_i)}.count == params[:tags].count }

回答

1

如果你想具有標籤1,2和3的視頻,想象什麼結果行需要的樣子。你會意識到你需要每個標籤一列。爲此,您需要爲每個要匹配的標記加入一次tags_videos。

SELECT videos.* FROM videos 
INNER JOIN tags_videos t1 ON (t1.video_id = videos.id AND t1.tag_id=1) 
INNER JOIN tags_videos t2 ON (t2.video_id = videos.id AND t2.tag_id=2) 
INNER JOIN tags_videos t3 ON (t3.video_id = videos.id AND t3.tag_id=3) 

我也使用了INNER JOIN而不是LEFT JOIN,因爲你對任何不匹配的東西都不感興趣。

從概念上講,您可以將此查詢視爲首先獲取具有標籤1的所有視頻,然後查看其中哪些也具有標籤2.因此,現在我們有帶tag1 + 2的視頻,我們可以看到哪些是那些也有tag3。您可以繼續使用盡可能多的標籤。

雖然我懷疑它適用於您的情況,但另一種方法是使用SET列類型來存儲視頻的所有標籤,但這隻允許使用64個不同的標籤。優點是這個列可以存儲在視頻表中,因此不需要連接(您只需要多次使用FIND_IN_SET的WHERE子句)

+0

是的,我的意思是我確定這是要走的路,我最終只是通過一些鐵軌收集聲明來做到這一點,但如果在這方面的表現失敗,我會訴諸於此。 – 2012-03-20 17:51:09

+0

根據系統中最終錄像的數量:這是我現在嘗試使用的一種非常方式,我知道它不好:Video.all.select {| v | PARAMS [:標籤]。選擇{| T | v.tag_ids.include?(t.to_i)}。count == params [:tags] .count} – 2012-03-20 17:52:46