【问题标题】:SQL Query for multiple matches on same column of associated tableSQL查询关联表的同一列上的多个匹配项
【发布时间】:2017-10-27 02:12:16
【问题描述】:

我有两张桌子,foos 和 bar。 bar 属于 foos,而 foos 有多个 bar(通过 ActiveRecord)。我想找到一个 foo,它的 bar 正好(并且只有)给定的 bar 名称列表。

例如(请原谅任何伪代码)

bars_list = ["A", "B"]
foo = find_foo(bars_list)
foo.bars.map(&:name) = ["A", "B"]

Find foo 不一定是严格意义上的函数。它可以是返回匹配 foo id 的 SQL 查询,也可以是非常高效的 ActiveRecord 函数。谢谢!

【问题讨论】:

  • 我使用了一个带有 INNER JOIN 的 SQL 查询,使用 WHERE EXISTS ...bar.name = ?... AND EXISTS ... bar.name = ? ...但是对于 bar.name="A" 和 bar.name="B" 都存在的 foos ,这没有得到任何匹配。有趣的是,如果我使用 EXISTS ... OR EXISTS ...,则返回所有正确的 foo,但我需要它们都存在。

标签: postgresql activerecord ruby-on-rails-5


【解决方案1】:

使用GROUP BYHAVING 过滤结果集以获得所需的匹配条记录数:

SELECT foos.*
FROM foos
JOIN bars ON bars.foo_id = foos.id
WHERE bars.name IN ('bar1', 'bar2')
GROUP BY foos.id, foos.name
HAVING COUNT(*) = 2;

如果你有三个名字,检查COUNT(*) = 3等等。

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 2013-02-18
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多