Mysql查询包括多个标签的文章

一篇文章里有多个标签,用关联表处理。如何能够查找 即包括 A 标签又包含 B 标签的文章。

阅读 5.6k
评论
    2 个回答

    有两种方式,第一种是利用count,如果一篇文章包含A,B,D三个标签,那么pintag中指向该文章且标签为A或B或D的记录数一定是三条「这里可能需要去重」。下面就是利用这种方式实现的语句,只需要修改in后面括号内的内容和count=后面的数字即可。

    SELECT
        *
    FROM
        article table1
    LEFT JOIN pintag table2 ON table2.artId = table1.id
    WHERE
        table2.tagId IN (1, 3)
    GROUP BY
        table1.id
    HAVING
        COUNT(
            DISTINCT table1.id,
            table2.tagId
        ) = 2
    

    第二种方式就是有多少个标签就join多少张表,虽然效率比较坑,而且拼接起来比较麻烦。但是胜在简单,如果只是临时用用而且对性能无要求,可以用这种方式将就。

    SELECT
        DISTINCT table1.*
    FROM
        article table1
    LEFT JOIN pintag table2 ON table2.artId = table1.id
    LEFT JOIN pintag table3 ON table3.artId = table1.id
    WHERE table2.tagId =1
    AND table3.tagId =3
    
    评论 赞赏
      AntonyBi
      • 1.3k

      这种基于标签的查询用关系型数据库会非常蛋疼,不论怎么处理性能都不会太好。如果对遇到对性能要求比较高的场景,建议用redis对多个标签进行and操作进行查询。

      比如:

      tag1对应book1、book2;
      tag2对应book2、book3;
      tag1 and tag2就可以查询到book2!
      
      评论 赞赏
        撰写回答

        登录后参与交流、获取后续更新提醒