mysql - 如何在 MySQL 中查询一对多的精确匹配?
问题描述
我有两个表 T1 和 T2,从 T1 到 T2 具有一对多关系。假设我想在 T1 中搜索与 T2 中的查询行完全匹配的行。
例如,
表 T1
ID |
---|
x1 |
x2 |
表 T2
ID | t1_id |
---|---|
y1 | x1 |
y2 | x1 |
y4 | x2 |
y5 | x2 |
当我查询 y1 和 y1 时,它不应该返回 x1。同样,如果我查询 y1 和 y4 那么它也不应该返回任何东西。只有当我准确地查询 y1 和 y2 时,它才应该返回 x1。当我查询 y4 和 y5 时,它应该返回 x2。
我所做的是使用GROUP_CONCAT()
T1 的 id 连接 T2 并检查搜索词都匹配 GROUP_CONCAT。我的查询看起来像
SELECT t1_id
FROM T2
GROUP BY t1_id
HAVING GROUP_CONCAT(id ORDER BY id)='y1y2'
尽管它可以完成工作,但我认为这不是最有效的方法。考虑到这是一个普遍的问题,应该有更好的方法。我找不到合适的术语在其他线程中搜索。
解决方案
SELECT t1_id
FROM table2
GROUP BY t1_id
HAVING HAVING SUM(t2.t1_id IN ('y4', 'y5')) = COUNT(t2.t1_id)
查询忽略t1_id IS NULL
. 如果您需要不包含 NULL 的行,请使用COUNT(*)
.
该查询不检查表中不存在的值是否存在于输入列表中。即,如果输入列表是('y1', 'y2', 'y3')
那么x1
将被返回,尽管该值'y3'
不在表中。
推荐阅读
- python - 为python程序生成突变体
- text - 如何将表示原始数字的字符串(例如 130000.1293)操作为格式化字符串(例如 130,000.13)?
- python - 带有 lambda 函数和标量的字典理解
- webdriver - Appium 记录的代码在通过节点启动时不起作用
- sas - 在 SAS Enterprise Guide 中创建格式为 YYYY-MM-DD HH:MM_SS 的宏
- java - 在 Windows 中启动时以管理员权限启动 java 应用程序
- django - 如何使用 Django Rest Framework 视图集按父对象的属性过滤嵌套数据
- docker - 如何将构建阶段创建的文件与同一阶段的dockerfile一起使用?
- docker - 使用刚刚复制的文件运行 docker
- cassandra - 将数据从 cassandra 加载到 powerbi 时如何解决数据限制错误?