2012-05-18 27 views
1

我嘗試使用以下3個表格,使我的關鍵字搜索儘可能高效:SQL多對多選擇帶有鏈接表

tblImageFiles [ID, IMAGEURL]

tblTags [ID,標籤]

tblxImagesTags [ID,圖像標識,標籤識別](這是一個linktable加入上述在多對多的關係)

任何人都可以幫助我一個存儲過程返回所有匹配所有搜索標籤匹配基於這種模式的圖像?

感謝

+1

相似的問題(有很多方法可以做到這一點):[如何篩選具有多對一關係的SQL結果](http://stackoverflow.com/questions/7364969/how-to- filter-sql-results-in-a-many-through-relation) –

回答

1

count(distinct aux.TagID)中的數字必須等於where t.Tag in (tag1, tag2, tag3)中的標籤數量。

select img.* from tblImageFiles img 
inner join (
    select it.ImageID from tblTags t 
    inner join tblxImagesTags it on it.TagID = t.ID 
    where t.Tag in (tag1, tag2, tag3) 
    group by it.ImageID 
    having count(distinct it.TagID) = 3 
) aux on aux.ImageID = img.ID 
+0

謝謝,但我運行查詢時收到以下消息: SELECT子句中的錯誤:'IF'附近的表達式 任何想法? – Mike

+0

@Mike是的,我糾正了。我使用if作爲別名,但它是一個保留鍵。而且我改變了代碼,把它放在你想要的地方。 –

+0

嗯,這與Matts的建議一樣有效,但它返回與任何標籤匹配的圖像而不是過濾,以及關於如何實現此目的的任何建議? – Mike

1
 SELECT tblImageFiles.ImageURL 
      FROM tblImageFiles 
    WHERE EXISTS (SELECT 1 
        FROM tblxImagesTags 
      INNER JOIN tblTags 
        ON tblTags.ID = tblxImagesTags.TagID 
       WHERE tblxImagesTags.ImgageID = tblImageFiles.ID 
        AND tblTags.Tag = <searchtag1>) 
    AND EXISTS (SELECT 1 
        FROM tblxImagesTags 
      INNER JOIN tblTags 
        ON tblTags.ID = tblxImagesTags.TagID 
       WHERE tblxImagesTags.ImgageID = tblImageFiles.ID 
        AND tblTags.Tag = <searchtag2>) 
       // etc... 

派生表可以被分離出來,但是對於語法取決於你使用的是什麼DB。您還需要運行一個循環以確保您可以應對可變數量的搜索條件,但這是基本思路。

+0

感謝,這看起來很接近,但返回匹配任何標籤的圖像,我需要它匹配所有這些標籤,如果可能的話,例如,搜索'門'應該產生比'紅色,門'更多的結果,因爲它應該過濾 – Mike

+0

我的不好 - 誤解了這個問題。現在更新。 –