【问题标题】:Multiple reverse lookup on an association table关联表上的多次反向查找
【发布时间】:2013-09-09 14:34:27
【问题描述】:

我有一张大致像这样的桌子。每个链接可以有任意数量的位置。

| link | location
| aa   |  1
| aa   |  2
| aa   |  3
| bb   |  1      <== location can belong to multiple links
| bb   |  3
| cc   |  4

我想要一个查询,它需要一组位置并返回它们对应的链接。预期结果示例:

given {1}          => no result, null etc.
given {1,2}        => no result, null etc.
given {1, 2, 3}    => result 'aa'
given {3, 2, 1}    => result 'aa'
given {1, 2, 3, 4} => no result, null etc.
given {4}          => result 'cc'

理想情况下,我会将此数据库端作为 SQL 查询运行,特别是在 sqlite3 上的 Rails Active Record 中,但这并非不重要,因为我追求的是一般方法而不是特定解决方案。

我考虑过 group-by,但表格可能很大,我希望查找速度快。

【问题讨论】:

    标签: activerecord sqlite


    【解决方案1】:

    GROUP BY 的查询当然很简单:

    SELECT link
    FROM MyTable
    GROUP BY link
    HAVING COUNT(*) = 3
       AND COUNT(location IN (1, 2, 3)) = 3
    

    为避免必须计算所有链接的计数,您可以尝试在第一步中过滤掉没有任何所需位置的链接:

    SELECT link
    FROM MyTable
    WHERE link IN (SELECT link
                   FROM MyTable
                   WHERE location IN (1, 2, 3))
    GROUP BY link
    HAVING COUNT(*) = 3
       AND COUNT(location IN (1, 2, 3)) = 3
    

    这在实践中是否有帮助取决于实际数据中值的分布。

    【讨论】:

      猜你喜欢
      • 2014-12-08
      • 1970-01-01
      • 2018-01-04
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 2010-10-07
      相关资源
      最近更新 更多