我有一個客戶,要我做一個標記系統。我有三個表格:items
,tags
和item_tag_assoc
- 最後一個僅用於關聯item_ids和tag_ids。以下是我遇到的問題:MySQL複雜的加入多個包含和排除
如果用戶請求包含標籤[1,2,3]和排除標籤[4,5,6],則結果應該是所有具有每個標籤的項目[ 1,2,3](不只是一個)和NO標籤[4,5,6]。我如何編寫查詢來完成此操作?
我研究了足夠找出內部連接的標籤包括:
SELECT i.item_id, i.item_title FROM items AS i INNER JOIN tag_item_assoc AS tia1 ON (tia1.item_id = i.item_id AND tia1.tag_id = 1)
...和你想僅包含在同一個內鏈模式加入儘可能多的標籤。它可能有點笨重,但用戶在移動之前不會選擇超過4或5個標籤,因此它可以。
我真的很希望我能排除以同樣的方式,和一切包裝成一個查詢:
INNER JOIN tag_item_assoc AS tia2 ON (tia2.item_id = i.item_id AND tia2.tag_id!= 2)
但它很快變得明顯,是行不通的。我讀了幾篇文章,說LEFT OUTER JOIN
s可以讓我排除,但我不明白,主要是因爲流浪WHERE
條款。 LEFT OUTER JOIN
s和INNER JOIN
s的任何排列我嘗試了或者產生了一個錯誤或非常混亂的結果。
說了這麼多 - 這裏有人知道我可以做到這一點嗎?我很抱歉沒有任何有用的代碼示例提供。如果INNER JOIN
是一個障礙,我可以從頭開始 - 我只需要一種方法來同時完成多個關聯包含和排除。預先感謝您的幫助和專業知識!
可能與標籤IN(1,2,3) – 2012-08-13 07:25:45
不一樣 - IN(1,2,3)將與標籤[1],[1,3]等項目相匹配,我需要僅在集合[1,2,3]中找到具有EVERY標籤的項目。感謝您的迴應,希望澄清! – CodeMoose 2012-08-13 07:47:36
如果您能提供相同的樣品數據和樣品輸出,這將會很有幫助。 – Omesh 2012-08-13 07:50:23