首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL查询多对多:查找给定集合中包含所有标签的所有项目

基础概念

在关系型数据库中,多对多关系通常通过一个中间表(也称为关联表或连接表)来实现。假设我们有两个表:projectstags,它们之间的关系通过一个中间表 project_tags 来表示。

  • projects 表存储项目信息。
  • tags 表存储标签信息。
  • project_tags 表存储项目和标签之间的关联关系。

相关优势

多对多关系的优势在于:

  1. 灵活性:可以轻松地为一个项目添加或删除多个标签。
  2. 扩展性:可以方便地添加新的标签或项目,而不需要修改表结构。

类型

多对多关系的类型主要体现在中间表的设计上:

  • 简单关联表:仅包含两个外键,分别指向 projectstags 表。
  • 带额外信息的关联表:除了外键外,还可以包含其他信息,如关联时间等。

应用场景

多对多关系在许多实际应用中都有广泛的应用,例如:

  • 博客系统:一个博客文章可以有多个标签,一个标签也可以对应多篇博客文章。
  • 电商系统:一个商品可以有多个分类标签,一个分类标签也可以对应多个商品。

查询给定集合中包含所有标签的所有项目

假设我们有以下表结构:

代码语言:txt
复制
-- projects 表
CREATE TABLE projects (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

-- tags 表
CREATE TABLE tags (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

-- project_tags 表
CREATE TABLE project_tags (
    project_id INT,
    tag_id INT,
    PRIMARY KEY (project_id, tag_id),
    FOREIGN KEY (project_id) REFERENCES projects(id),
    FOREIGN KEY (tag_id) REFERENCES tags(id)
);

假设我们要查找包含所有给定标签的所有项目,可以使用以下 SQL 查询:

代码语言:txt
复制
SELECT p.id, p.name
FROM projects p
WHERE NOT EXISTS (
    SELECT 1
    FROM tags t
    WHERE t.name IN ('tag1', 'tag2', 'tag3') -- 给定的标签集合
      AND NOT EXISTS (
          SELECT 1
          FROM project_tags pt
          WHERE pt.project_id = p.id
            AND pt.tag_id = t.id
      )
);

解释

  1. 外层查询:从 projects 表中选择项目。
  2. 内层查询:检查每个项目是否包含所有给定的标签。
  3. NOT EXISTS:确保每个给定的标签都在项目的标签集合中。

参考链接

通过这种方式,我们可以有效地查询包含所有给定标签的所有项目。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

菜鸟mybatis实战教程

sql (4)统计分组 四、分页查询 五、复杂查询 (1)一查询 (2)查询 (3)查询 (4)...resultType 从这条语句中返回期望类型完全限定名或别名。 注意如果返回集合,那应该设置为集合包含类型,而不是集合本身。...resultType 从这条语句中返回期望类型完全限定名或别名。 注意如果返回集合,那应该设置为集合包含类型,而不是集合本身。...查询结果 (3)查询 查询在mybatis里实现方式跟一方式差不多,只不过是要涉及到3张表联合查询,同样要处理List,下面给出案例。...3个表查询 查询结果 同理也可以查询User表,因为是关系,所以在user类需要添加private List commentList;,然后持久层对应UserMapper.xml

1K20

系统设计之图状数据模型

多关系是不同数据模型之间重要区别特征。若数据大多是一(树结构数据)或记录之间无关系,则文档模型最合适。...但若多关系数据很常见,关系模型能处理简单,但随数据之间关联复杂度增加,将数据建模转化为图模型更自然。 图组成: 顶点(也称为结点或实体) 边(也称为关系或弧) 很多数据能建模为图。...属性图 在属性图模型,每个顶点包括: 唯一标识符 出边集合 入边集合 属性集合(键-值) 每个边包括: 唯一标识符 边开始顶点(尾部顶点) 边结束顶点(头部顶点) 描述两个顶点间关系类型标签...没有模式限制哪种事物可或不可关联 给定某顶点,可高效得到它所有入、出边,从而遍历图,即沿着这些顶点链条一直向前或向后(这就是为何图2-2在tail_vertex和 head_vertex列上都建立索引原因...示 2-5 采用该技术SQL表达来执行相同 查询查找从美国移民到欧洲的人员名单 ),目前PostgreSQL IBM DB2, Oracle SQL Server 支持该技术 ,但与Cypher丰目比

54020
  • 多数据模型数据库 | 应用实例解析

    所以仅仅从市面上现存模型数据库产品(有些真的是模型数据库,有些仅仅将自己炒作成模型数据库)去总结,很难模型数据库有明确定义,这也导致那些为自己产品或者项目寻求模型解决方案的人员模型数据库产品理解不清晰...“图查询”是指涉及到edge特定连接特性查询,例如:最短路径、图遍历和模式匹配。模型数据库模式匹配会根据任意查询条件复杂组合,查询出符合该组合条件所有路径。...我们可以将所有数据放在一个(vertices)集合,也可以将它们分成不同集合 - 例如分别对飞机,部件和各个部件进行分类,每类数据一个集合。...1、给定一个组件,查看该组件所有组成部分是什么 要回答该问题,需要从图中特定vertices(某个给定组件)开始,首先找到指定组件,并找到与该“组件”vertices通过edge相连所有的下层...并且指定哪些document集合包含vertices,哪些document集合包含edge,来定义一个graph。

    1.9K10

    常见Mybatis面试题详细讲解大全

    都有哪些动态sql?能简述一下动态sql执行原理不? 8、Mybatis是如何将sql执行结果封装为目标对象并返回?都有哪些映射形式? 9、Mybatis能执行一一、一关联查询吗?...答:能,Mybatis不仅可以执行一一、一关联查询,还可以执行一,关联查询查询,其实就是一查询,只需要把selectOne()修改为selectList()即可;查询...答:Mybatis仅支持association关联对象和collection关联集合对象延迟加载,association指就是一一,collection指就是一查询。...原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下标签包含B标签,待所有标签解析完毕,Mybatis...而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

    1.9K51

    Java学习笔记-全栈-web开发-15-MyBatis

    ‘’; 查询时,多个if并联时候,比如当第一个if不满足时,拼接结果就会一个"and"导致出错,使用where标签,会去掉条件第一个and符号。...,一 6.1 一一 需求: 根据商品ID查找订单,包括用户名和地址 SQL语句: #查找某个定单id信息,包括用户名字和地址 SELECT o....6.3 需求:查询用户信息及用户购买商品信息,要求将关联信息映射到主pojopojo属性 ?...6.4 总结 一一:模型里面写模型(association) 一:模型里面写集合(collection) resultType:将查询结果按照sql列名pojo属性名一致性映射到pojo。...唯一标识:Mapped sqlid,且包含namespace。 Mapped sql:就是包含sql语句xxMapper.xml,需要将其注册到全局配置文件Mappers才能生效。

    1.4K20

    MyBatis详解

    8.1、高级映射之多一 8.1.1、一实现原理 8.1.2、实现一 方式1:级联属性映射(一条SQL语句) 方式2:关联标签(一条SQL语句) 方式3:分步查询...,两条SQL语句(可复用,支持懒加载) 开启懒加载 8.2、高级映射之一 8.2.1、一实现原理 8.2.2、实现一 方式1:collection 方式2:分步查询 8.3、实现思路...:前端导航卡片直接显示页码数量 八、高级映射 前面讲解都是一映射关系,也就是一个类(一张表)对应一个实体(对象),但实际环境是存在一一、关系。...一:多是主表 一 :一是主表 8.1、高级映射之多一 8.1.1、一实现原理 一需要查询两张表,其中一方是主表。 多表连接需要外键来实现。...8.2、高级映射之一 8.2.1、一实现原理 一,一一方是主表,如下图t_clazz是主表。

    2K30

    Mybatis面试问题锦集

    有了列名与属性名映射关系后,Mybatis通过反射创建对象,同时使用反射给对象属性逐一赋值并返回,那些找不到映射关系属性,是无法完成赋值。 9、Mybatis能执行一一、一关联查询吗?...答:能,Mybatis不仅可以执行一一、一关联查询,还可以执行一,关联查询查询,其实就是一查询,只需要把selectOne()修改为selectList()即可;查询...,其实就是一查询,只需要把selectOne()修改为selectList()即可。...答:Mybatis仅支持association关联对象和collection关联集合对象延迟加载,association指就是一一,collection指就是一查询。...原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下标签包含B标签,待所有标签解析完毕,Mybatis

    3.1K20

    MyBatis面试题集合,90%会遇到这些问题

    有了列名与属性名映射关系后,Mybatis通过反射创建对象,同时使用反射给对象属性逐一赋值并返回,那些找不到映射关系属性,是无法完成赋值。 7、Mybatis能执行一一、一关联查询吗?...能,Mybatis不仅可以执行一一、一关联查询,还可以执行一,关联查询查询,其实就是一查询,只需要把selectOne()修改为selectList()即可;查询,...其实就是一查询,只需要把selectOne()修改为selectList()即可。...Mybatis仅支持association关联对象和collection关联集合对象延迟加载,association指就是一一,collection指就是一查询。...原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下标签包含B标签,待所有标签解析完毕,Mybatis

    1.1K10

    【39期】Mybatis面试18问,你想知道都在这里了!

    有了列名与属性名映射关系后,Mybatis通过反射创建对象,同时使用反射给对象属性逐一赋值并返回,那些找不到映射关系属性,是无法完成赋值。 9、Mybatis能执行一一、一关联查询吗?...答:能,Mybatis不仅可以执行一一、一关联查询,还可以执行一,关联查询查询,其实就是一查询,只需要把selectOne()修改为selectList()即可;查询...,其实就是一查询,只需要把selectOne()修改为selectList()即可。...答:Mybatis仅支持association关联对象和collection关联集合对象延迟加载,association指就是一一,collection指就是一查询。...原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下标签包含B标签,待所有标签解析完毕,Mybatis

    1.4K21

    Mybatis面试18问,你想知道都在这里了

    有了列名与属性名映射关系后,Mybatis通过反射创建对象,同时使用反射给对象属性逐一赋值并返回,那些找不到映射关系属性,是无法完成赋值。 9、Mybatis能执行一一、一关联查询吗?...答:能,Mybatis不仅可以执行一一、一关联查询,还可以执行一,关联查询查询,其实就是一查询,只需要把selectOne()修改为selectList()即可;查询...,其实就是一查询,只需要把selectOne()修改为selectList()即可。...答:Mybatis仅支持association关联对象和collection关联集合对象延迟加载,association指就是一一,collection指就是一查询。...原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下标签包含B标签,待所有标签解析完毕,Mybatis

    11310

    MyBatis面试题集合,90%会遇到这些问题

    有了列名与属性名映射关系后,Mybatis通过反射创建对象,同时使用反射给对象属性逐一赋值并返回,那些找不到映射关系属性,是无法完成赋值。 7、Mybatis能执行一一、一关联查询吗?...能,Mybatis不仅可以执行一一、一关联查询,还可以执行一,关联查询查询,其实就是一查询,只需要把selectOne()修改为selectList()即可;查询,...其实就是一查询,只需要把selectOne()修改为selectList()即可。...Mybatis仅支持association关联对象和collection关联集合对象延迟加载,association指就是一一,collection指就是一查询。...原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下标签包含B标签,待所有标签解析完毕,Mybatis

    1K20

    SqlAlchemy 2.0 中文文档(十三)

    查询项目 WriteOnlyCollection 在任何时候都不会存储集合当前内容引用,也不具有直接发出 SELECT 到数据库以加载它们行为;其覆盖假设是集合可能包含数千或数百万行,并且不应作为任何其他操作副作用而完全加载到内存...查询项目 WriteOnlyCollection 在任何时候都不会存储集合当前内容引用,也不会具有直接发出 SELECT 到数据库以加载它们行为;覆盖假设是集合可能包含许多千万个行,并且绝不应作为任何其他操作副作用完全加载到内存...下一次刷新时,给定项目将以父实例集合形式持久化到数据库。...查询项目 WriteOnlyCollection不会在任何时候存储集合当前内容引用,也不会有任何直接发出 SELECT 到数据库以加载它们行为;其覆盖假设是集合可能包含许多千万个或数百万个行,并且不应作为任何其他操作副作用完全加载到内存...对于批量更新和删除集合,为了使 UPDATE 或 DELETE 语句与父对象主键相关联,关联表必须明确地包含在 UPDATE/DELETE 语句中,这要求后端包含非标准 SQL 语法支持,或者在构建

    20210

    MyBatis 从浅入深 随笔整理

    ,就可以进而获取SqlSession实例,SqlSession对象完全包含以数据库为背景所有执行SQL操作方法。...,其所有的settings配置都放在父标签settings标签 4. typeAliases元素 作用是配置类型别名,通过与MyBatisSQL映射文件相关联,减少输入多余完整类名 两种方式: 1...接口中方法与映射文件SQL语句id应一一应 2. chche: 配置给定命名空间缓存 3. cache-ref: 从其他命名空间引用缓存配置 4. resultMap: 用来描述数据库结果集和对象对应关系...不同sqlSession两次执行相同namespace下sql语句,且向sql传递参数也相同,即最终执行相同sql语句,则第一次执行完毕会将数据库查询数据写到缓存,第二次查询会从缓存获取数据...最后: 对于MyBatis缓存内容仅做了解即可,因为面对一定数据量,内置Cache方式就派不上用场了 并且查询结果集做缓存并不是MyBatis框架擅长,它专心做应该是SQL映射,所有我们一般采用

    1.8K30

    《数据密集型应用系统设计》 - 数据模型和查询语言

    虽然关系型数据库扩展带来是越来越复杂关系模型,但是关系模型最大特点是只需要构建一次查询优化器就可以使得所有的应用程序都可以通用。最终查询优化器解决了网络模型链路查找痛点问题。...换句话说声明式查询只关注整体规范,不关注具体实现,但是在SQL存在诸多限制,所以SQL也存在许多优化空间,太过自由和不够自由是声明式查询优点和缺点。...以此为代表声明式查询有下面几种结构: SQL WEB标签 命令式查询 命令式查询好处是对于业务处理灵活性十足, 相比于声明式抽象和难以排查,命令式查询则具备较强逻辑性和可排查行。...属性图 在属性图模型,每个顶点包括:唯一标识符、 出边集合、 人边集合、 属性集合 (键-值) 每个边包括 :唯一标识符、边开始顶点(尾部顶点) 边结束顶点(头部顶点) 描述两个顶点间关系类型标签...查询逻辑类似 “树分叉匹配”方式处理,通过“包含”关系以及二元结构递归整个二三目录产生所有的匹配结果,最终形成下面的最终结果: 在最后一级也就是第三级当中可以指定who来查找具体的人。

    1K30

    必知必会:MyBatis 常见面试题总结

    9、MyBatis 能执行一一、一关联查询吗?都有哪些实现方式,以及它们之间区别。 注:我出。...答:能,MyBatis 不仅可以执行一一、一关联查询,还可以执行一,关联查询查询,其实就是一查询,只需要把 selectOne()修改为 selectList()即可;查询...,其实就是一查询,只需要把 selectOne()修改为 selectList()即可。...答:MyBatis 仅支持 association 关联对象和 collection 关联集合对象延迟加载,association 指就是一一,collection 指就是一查询。...而 MyBatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 映射工具。

    66620

    面试官问我了解Mybatis吗?我说了解,然后...........

    ,所以只要JDBC支持数据库 MyBatis都支持) 提供映射标签,支持对象与数据库ORM字段关系映射; 5.提供对象关系映射标签,支持对象关系组件维护,能够与Spring很好集成 虽然有这么优点...创建会话对象:由会话工厂创建 SqlSession 对象,该对象包含了执行 SQL 语句所有方法。 5....输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类 型。输出结果映射过程类似于 JDBC 结果集解析过程。...Mybatis仅支持association关联对象和collection关联集合对象延迟加载,association指就是 一一,collection指就是一查询。...十一:Mybatis如何执行批量操作 1.使用forEach标签 foreach主要用在构建in条件,它可以在SQL语句中进行迭代一个集合

    8410

    Mybatis夺命33问,你能回答道第几问

    创建会话对象:由会话工厂创建 SqlSession 对象,该对象包含了执行 SQL 语句所有方法。...Mybatis仅支持association关联对象和collection关联集合对象延迟加载,association指就是一一,collection指就是一查询。...18、Mybatis如何执行批量操作 使用foreach标签 foreach主要用在构建in条件,它可以在SQL语句中进行迭代一个集合。...原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下标签包含B标签,待所有标签解析完毕,Mybatis...28、Mybatis能执行一,一联系查询吗,有哪些实现方法 能,不止可以一,一一还可以,一 实现方式: 单独发送一个SQL查询关联对象,赋给主对象,然后返回主对象 使用嵌套查询

    29320

    《数据密集型应用系统设计》读书笔记(二)

    SQL将数据组织成关系,存储在表(table),其中每个关系都是元组(tuples)无序集合(在 SQL 称为行)。关系模型目标是将实现细节隐藏在更简洁接口后面。...在存在多关系模型,访问路径需要由应用程序代码进行跟踪,使得数据库查询与更新变得异常复杂而没有灵活性。 相比之下,关系模型则是定义了所有数据格式:关系(表)只是元组(行)集合。...map 函数发射键值按键分组,对于相同键所有键值,调用 reduce 函数 最终输出写入到 monthlySharksReport 集合 例如,假定观察集合包含如下两个文档: {...此外,还需要明确以下特征: 任何顶点都可以连接到其他任何顶点,没有模式限制哪种事物可以或不可以关联 给定某个顶点,可以高效地得到它所有入边和出边,从而实现图遍历 通过不同类型关系使用不同标签,...,我们可以继续进行一些高阶查询,例如查找所有从美国移民到欧洲的人员名单,即查找 BORN_IN 边指向美国,而 LIVING_IN 边指向欧洲所有顶点,然后返回每个这样顶点 name 属性。

    1.5K30
    领券