假设我有以下表:
标签
id:整数
名称:字符串
帖子
id:整数
正文:文本
标记
id:整数
tag_id:整数
post_id:整数
我将如何去写一个查询,选择所有的帖子都标记了以下标签(标签表的名称属性):“奶酪”,“葡萄酒”,“巴黎”,“弗雷斯”,“城市”,“风景”,“艺术”
另请参阅:Sql query to find things with most specified tags(注:相似,但不重复!)
假设我有以下表:
标签
id:整数
名称:字符串
id:整数
正文:文本
id:整数
tag_id:整数
post_id:整数
我将如何去写一个查询,选择所有的帖子都标记了以下标签(标签表的名称属性):“奶酪”,“葡萄酒”,“巴黎”,“弗雷斯”,“城市”,“风景”,“艺术”
另请参阅:Sql query to find things with most specified tags(注:相似,但不重复!)
2条答案
按热度按时间qv7cva1a1#
使用IN:
使用联接
使用EXISTS
说明
问题的关键是
COUNT(DISTINCT t.name)
需要匹配标签名称的数量,以确保所有标签都与帖子相关。如果没有DISTINCT,则存在一个风险,即重复的标签名称可能返回计数7--因此您将得到误报。性能
大多数方法会告诉您JOIN是最优的,但是JOIN也有在结果集中重复行的风险。EXISTS将是我的下一个选择--没有重复的风险,并且通常执行更快,但是检查解释计划最终会告诉您基于您的设置和数据什么是最好的。
p8ekf7hl2#
试试看:
说明:请求一个列表的那些帖子已经 * 每一个 * 指定的一组标签与它相关联是***等价***请求那些帖子在 * 没有 * 标签在同一个指定的组,已经*没有与它相关联.即,上面的sql.