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 で実行しますが、特定のソリューションではなく一般的なアプローチを求めているため、これは重要ではありません。

グループ化を検討しましたが、テーブルが巨大になる可能性があり、ルックアップを高速にしたいと考えています。

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 に答える