首页
学习
活动
专区
工具
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:确保每个给定的标签都在项目的标签集合中。

参考链接

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

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

相关·内容

2024-12-26:所有数对中数位差之和。用go语言,给定一个只包含正整数的数组 nums,其中所有整数的位数长度相同。 两个

给定一个整数数组 nums 和一个二维整数矩阵 queries,我们需要判断对于每一个查询 queries[i] = [fromi, toi],对应的子数组 nums[fromi..toi] 是否为特殊数组...因此这个查询的答案是 false。 子数组是 [1,6]。只有一对:(1,6),且包含了奇偶性不同的数字。因此这个查询的答案是 true。...大体步骤如下: 1.首先通过函数isArraySpecial来判断数组中每一对相邻元素的奇偶性是否不同,以确定是否为特殊数组。...5.将每个查询的结果存储在布尔数组res中,并返回该数组作为输出。 总的时间复杂度: • 对数组nums的遍历需要O(n)的时间复杂度,其中n为数组的长度。...• 对查询二维矩阵queries的遍历需要O(q)的时间复杂度,其中q为查询矩阵的长度。 • 因此,总的时间复杂度为O(n + q)。

9420

菜鸟的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丰目比

    55020

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

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

    1.9K10

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

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

    1.4K20

    常见的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映射工具。

    2K51

    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

    SqlAlchemy 2.0 中文文档(十三)

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

    22210

    【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

    11610

    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

    别再手动拼接 SQL 了,MyBatis 动态 SQL 写法应有尽有,建议收藏!

    以下语句表示为可以按照网站名称(name)或者网址(url)进行模糊查询。如果您不输入名称或网址,则返回所有的网站记录。但是,如果你传递了任意一个参数,它就会返回与给定参数相匹配的记录。...= null">#{phone}      6.MyBatis foreach标签 foreach是用来对集合的遍历,这个和Java中的功能很类似。...通常处理SQL中的in语句。 foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。...on  t.sid=s.sid 3.MyBatis多对多关联查询 多对多 以谁为主表查询的时候,主表约等于1的一方,另一方相当于多的一方-->     select  *  from

    1.5K10

    MyBatis 从浅入深 随笔整理

    ,就可以进而获取SqlSession实例,SqlSession对象中完全包含以数据库为背景的所有执行SQL操作方法。...,其所有的settings配置都放在父标签settings标签中 4. typeAliases元素 作用是配置类型别名,通过与MyBatis的SQL映射文件相关联,减少输入多余的完整类名 两种方式: 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语句中进行迭代一个集合。

    8610

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

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

    1.5K30
    领券