【问题标题】:How to query exact match for one-to-many in MySQL?如何在 MySQL 中查询一对多的精确匹配?
【发布时间】:2021-09-28 05:00:44
【问题描述】:

我有两个表 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'

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

【问题讨论】:

    标签: mysql one-to-many


    【解决方案1】:
    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(*)

    查询不检查表中不存在的值是否存在于输入列表中。 IE。如果输入列表为('y1', 'y2', 'y3'),则将返回x1,尽管'y3' 的值不在表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多