
本文旨在提供一种高效的 SQL 查询方法,用于在具有多对多关系的表中,筛选出与另一张表中所有指定条件相关的记录。我们将通过一个食谱和配料的示例,详细讲解如何使用 GROUP BY 和 HAVING COUNT() 子句实现这一目标。
假设我们有两个表:recipe(食谱)和 ingredient(配料),它们之间通过一个中间表 recipe_ingredient 建立多对多关系。我们需要查询出包含所有指定配料的食谱。例如,如果我们想找出既包含“鸡蛋”又包含“牛奶”的食谱,应该如何编写 SQL 语句?
为了更好地理解,我们先定义三个表的基本结构和示例数据:
recipe (食谱)
| id | name |
|---|---|
| 1 | pancakes |
| 2 | eggs |
ingredient (配料)
| id | name |
|---|---|
| 1 | eggs |
| 2 | flour |
| 3 | milk |
recipe_ingredient (食谱-配料关系)
| rid | iid |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
以下 SQL 查询语句可以实现我们的目标:
SELECT r.id, r.name FROM recipe r JOIN recipe_ingredient ri ON r.id = ri.rid JOIN ingredient i ON i.id = ri.iid WHERE i.name LIKE '%ilk%' OR i.name LIKE '%eg%' GROUP BY r.id HAVING COUNT(DISTINCT i.id) = 2;
代码解释:
执行结果:
| id | name |
|---|---|
| 1 | pancakes |
该查询结果表明,只有 id 为 1 的 pancakes 食谱同时包含 "ilk" (milk) 和 "eg" (egg) 这两种配料。
通过结合 GROUP BY 和 HAVING COUNT() 子句,我们可以有效地在多对多关系的表中筛选出满足所有指定条件的记录。这种方法适用于各种需要同时满足多个关联条件的数据查询场景,例如:
理解并掌握这种查询技巧,可以帮助我们更高效地从复杂的数据关系中提取所需信息。
以上就是使用 SQL 查询多对多关系表中满足所有条件的记录的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号