データセットの例:
id | tag
---|------
1 | car
1 | bike
2 | boat
2 | bike
3 | plane
3 | car
id
両方ともtag
索引付けされています。
タグ [車、自転車] に一致する ID を取得しようとしています (タグの数は異なる場合があります)。
そのための単純なクエリは次のようになります。
SELECT id
FROM test
WHERE tag = 'car'
OR tag = 'bike'
GROUP BY id
HAVING COUNT(*) = 2
ただし、group by と、1 つのタグに一致するすべての行が group by で考慮されるという事実のため、これは非常に非効率的です (そして、私は大量のボリュームを持っています)。
この状況でより効率的なクエリはありますか?
私が見る唯一の解決策は、次のようなものを含む別のテーブルを用意することです。
id | hash
---|------
1 | car,bike
2 | boat,bike
3 | plane,car
しかし、これを実装して最新の状態に維持するのは簡単なソリューションではありません。
追加情報:
- 名前の一致は正確である必要があります (全文索引なし)
- タグの数は常に 2 とは限りません