代码之家  ›  专栏  ›  技术社区  ›  thaddeusmt

多个“标签”(多对多关系)匹配所有标签的Mysql连接查询?

  •  18
  • thaddeusmt  · 技术社区  · 14 年前

    基本上,我希望用户能够添加越来越多的标签来过滤或“缩小”他们的搜索结果,就像newegg.com那样。

    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
    

    我还尝试了多种类似WHERE的条件,并结合在一起:

    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”匹配的结果行被分组“隐藏”。

    1 回复  |  直到 14 年前
        1
  •  35
  •   OMG Ponies    14 年前

    用途:

      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
    

    如果只需要同时存在两个标记的行,则不需要左连接。