1

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

| 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,但表格可能很大,我希望查找速度快。

4

1 回答 1

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

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

于 2013-09-09T19:49:08.253 回答