mysql查询同时包含多个标签的文章

深度链接 / 2023-12-06 21:48:19 / 173

一篇文章含有多个标签,需要查找出所有包含标签a和标签b的文章。如何写查询语句呢?

1、例如要查找所有同时含有标签a和标签b的文章

首先需要满足文章含有标签a或者含有标签b(需要去除重复情况),标签a、b所对应的标签id分别为12、16,实现语句如下:

#查询语句
mysql> SELECT 
    -> `title` 
    -> FROM 
    -> xxx_post,xxx_post_tag
    -> WHERE 
    -> xxx_post.id = xxx_post_tag.post_id AND (xxx_post_tag.tag_id = 12 or xxx_post_tag.tag_id = 16) GROUP BY xxx_post.title
    -> HAVING 
    -> count(distinct xxx_post.title,xxx_post_tag.tag_id) = 2;

#查询结果
mysql> SELECT 
    -> `title` 
    -> FROM 
    -> xxx_post,xxx_post_tag
    -> WHERE 
    -> xxx_post.id = xxx_post_tag.post_id AND (xxx_post_tag.tag_id = 12 or xxx_post_tag.tag_id = 16) GROUP BY xxx_post.title
    -> HAVING 
    -> count(distinct xxx_post.title,xxx_post_tag.tag_id) = 2;
+-----------------------------------------------------------------------------------------+
| title                                                                                   |
+-----------------------------------------------------------------------------------------+
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
| XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                 |
+-----------------------------------------------------------------------------------------+
10 rows in set (0.00 sec)

#扩展,如果需要增加匹配标签,则只需修改AND后括号内的内容和count后的数值
#也可以这样写
mysql> SELECT 
    -> `title` 
    -> FROM 
    -> xxx_post,xxx_post_tag
    -> WHERE 
    -> xxx_post.id = xxx_post_tag.post_id AND xxx_post_tag.tag_id IN (12,16) GROUP BY xxx_post.title
    -> HAVING 
    -> count(distinct xxx_post.title,xxx_post_tag.tag_id) = 2;