关联表上的多次反向查找

时间:2013-09-09 14:34:28

标签: activerecord sqlite

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

| 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中,但这并不重要,因为我是在采用一般方法而不是特定解决方案。

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

1 个答案:

答案 0 :(得分: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

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