簡體   English   中英

Mysql連接查詢匹配所有標簽的多個“標簽”(多對多關系)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM