2012-11-21 111 views
1

我有三個表格,圖像,標籤和鏈接(見下表)SQL過濾通過多個標籤

ImageNO | TagNO 
    1  | Sport 
    2  | Cars 
    3  | Sport 
    4  | Sport 
    3  | Cars 
    1  | Music 
    2  | Sport 

(顯然TAGNO將是實際的表的數字)

我想什麼do允許過濾,以便用戶可以選擇任意數量的標籤,並將圖像過濾爲只有選擇了所有標籤的圖像。例如,如果用戶選擇「運動」,則將顯示「圖像NO」1,3,4和2。如果用戶也選擇「汽車」,則查詢被細化並且僅顯示「圖像NO」3和2。

我從整個網絡的例子嘗試了一些事情,到目前爲止,這是最接近我來......

SELECT * 
FROM images 
    LEFT JOIN links 
    ON INO = links.INO 
    LEFT JOIN tags 
    ON tags.TagNO = links. TagNO 
    WHERE links. TagNO 
    IN ($tags) 
    GROUP BY INO 
    HAVING COUNT(INO) >1 

($標籤)是標籤的數字陣列。

這個問題是隻有一個標籤的圖像將永遠不會顯示爲計數數= 1而不是> 1.任何幫助將不勝感激,在此先感謝。

+1

請停止編輯並刪除其他人提供有益的格式化的重要的一點。如果所提供的數據和SQL格式易於閱讀,那麼對於某人來說,幫助您更容易。 – LOD121

+0

你可以用一個位掩碼來做到這一點。如果我能想到一個具體的實現,我會附加它。 – ethrbunny

回答

0

您必須在同一張桌子上加入多次。使用別名來爲此:

SELECT * FROM images 
    LEFT JOIN links AS l1 ON l1.INO = images.INO 
    LEFT JOIN tags AS t1 ON t1.TagNO = l1.TagNO 
    LEFT JOIN links AS l2 ON l2.INO = images.INO 
    LEFT JOIN tags AS t2 ON t2.TagNO = l2.TagNO 
    [...] 
    WHERE t1.tagNO = $tag1 
    AND t2.tagNO = $tag2 
    [...] 
+0

感謝您回覆kmkaplan,$ tags被作爲一個數組傳遞,所以有一個未定義數量的標籤,這是否仍然有效? – user1535190

+0

是的......但是你必須建立一個SQL,其中包含'link'和'tags'連接的數量與'$ tags'中的元素一樣多。那就是你需要在運行時建立SQL請求。 – kmkaplan

+0

好的,謝謝,我會放棄它。 – user1535190

2

我覺得this question解決同樣的問題,而accepted answer的做法可能會爲你工作了。沿着線的東西:

SELECT * 
FROM images i 
JOIN links l ON l.INO = i.INO 
JOIN tags t ON t.TagNO = l.TagNO 
WHERE l.TagNO IN ('sports','cars') 
GROUP BY i.INO 
HAVING COUNT(DISTINCT t.TagNO) = 2 

...作爲COUNT(DISTINCT t.TagNO) = [number of tags]