我有一张看起来像这样的桌子。每个链接可以有任意数量的位置。
| 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中,但这并不重要,因为我是在采用一般方法而不是特定解决方案。
我考虑过分组,但表格可能很大,我希望查找速度快。
答案 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
这在实践中是否有帮助取决于实际数据中值的分布。