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

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

阅读 10.4k
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

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

比如:

tag1对应book1、book2;
tag2对应book2、book3;
tag1 and tag2就可以查询到book2!
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏