首页 > 解决方案 > 如何在 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'

尽管它可以完成工作,但我认为这不是最有效的方法。考虑到这是一个普遍的问题,应该有更好的方法。我找不到合适的术语在其他线程中搜索。

标签: mysqlone-to-many

解决方案


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'不在表中。


推荐阅读