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;