[英]Mysql join query for multiple “tags” (many-to-many relationship) that matches ALL tags?
我試圖查詢匹配給定標簽集的所有對象。
基本上我希望用戶能夠添加越來越多的標簽來過濾或“縮小”他們的搜索結果,有點像newegg.com。
我的表結構是一個對象表,一個標簽表和一個MANY:MANY關系表ObjectsTags。 所以我有一個像這樣的JOIN查詢:
SELECT * FROM Objects
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id)
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id)
我嘗試使用IN子句/條件,如下所示:
SELECT * FROM Objects
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id)
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id)
WHERE Tags.name IN ('tag1','tag2')
GROUP BY Objects.id
但我了解到這會模擬一系列OR,因此您在查詢中添加的標簽越多,您獲得的結果就越多,而不是像我希望的那樣縮小結果集。
我也試過做多個LIKE WHERE條件,ANDed一起:
SELECT * FROM Objects
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id)
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id)
WHERE Tags.name LIKE 'tag1'
AND Tags.name LIKE 'tag2'
GROUP BY Objects.id
但是這不會返回結果,因為當結果組合在一起時,OUTER JOINed Tags.name列只包含'tag1',而不是'tag2'。 'tag2'匹配的結果行由GROUPing“隱藏”。
如何匹配所有標簽以獲得我所追求的“縮小”或“向下鑽取”效果? 謝謝。
使用:
SELECT *
FROM OBJECTS o
JOIN OBJECTSTAGS ot ON ot.object_id = o.id
JOIN TAGS t ON t.id = ot.tag_id
WHERE t.name IN ('tag1','tag2')
GROUP BY o.id
HAVING COUNT(DISTINCT t.name) = 2
你錯過了HAVING子句。
如果您只想要存在兩個標記的行,則無需LEFT JOIN。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.