加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

需要sql查询帮助来查找标记有所有指定标签的内容

发布时间:2020-12-11 23:53:47 所属栏目:MySql教程 来源:网络整理
导读:假设我有以下表格: TAGS id:整数 name:string 帖子 id:整数 主体 引用的Tagging id:整数 tag_id:整数 post_id:整数 我将如何编写一个查询,选择所有标记有以下所有标记的帖子(标签表的名称属性):“Cheese”,“Wine”,“Paris”,“Frace”,“City”,“

假设我有以下表格:

TAGS

id:整数
name:string

帖子

id:整数
主体

引用的Tagging

id:整数
tag_id:整数
post_id:整数

我将如何编写一个查询,选择所有标记有以下所有标记的帖子(标签表的名称属性):“Cheese”,“Wine”,“Paris”,“Frace”,“City”,“风景“,”艺术“

另见:Need help with sql query to find things with most specified tags(注意:类似,但不重复!) 最佳答案 使用IN:

SELECT p.*
  FROM POSTS p
 WHERE p.id IN (SELECT tg.post_id
                  FROM TAGGINGS tg
                  JOIN TAGS t ON t.id = tg.tag_id
                 WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
              GROUP BY tg.post_id
                HAVING COUNT(DISTINCT t.name) = 7)

使用JOIN

SELECT p.*
  FROM POSTS p
  JOIN (SELECT tg.post_id
          FROM TAGGINGS tg
          JOIN TAGS t ON t.id = tg.tag_id
         WHERE t.name IN ('Cheese','Art')
      GROUP BY tg.post_id
        HAVING COUNT(DISTINCT t.name) = 7) x ON x.post_id = p.id

使用EXISTS

SELECT p.*
  FROM POSTS p
 WHERE EXISTS (SELECT NULL
                 FROM TAGGINGS tg
                 JOIN TAGS t ON t.id = tg.tag_id
                WHERE t.name IN ('Cheese','Art')
                  AND tg.post_id = p.id
             GROUP BY tg.post_id
               HAVING COUNT(DISTINCT t.name) = 7)

说明

问题的关键是COUNT(DISTINCT t.name)需要匹配标记名称的数量,以确保所有这些标记与帖子相关.如果没有DISTINCT,那么其中一个名称的重复可能会返回7的风险 – 所以你会有误报.

性能

大多数人会告诉你JOIN是最优的,但是JOIN还冒着重复结果集中的行的风险. EXISTS将是我的下一个选择 – 没有重复的风险,通常执行速度更快,但检查解释计划最终将根据您的设置和数据告诉您什么是最好的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读