写真用カメラを販売する Web サイトであるとします。ここに私のエンティティ(テーブル)があります:
Camera: A simple camera
Feature: A feature like: 6mp, max resolution 1024x768,
問題はカメラと機能の間です。多対多の関係があるため、追加のテーブルがあります。
camera -> cameras_features -> feature
したがって、クエリは単純です。
機能 1、2、および 3 を持つすべてのカメラを取得するにはどうすればよいですか?
これは、ビットマップ インデックスを作成するようなものです。
ソリューションが適切かどうかをテストするために使用できるデータ
C1 has features 1,2,3
C2 has features 1,2,4
C3 has features 1,2
クエリと期待される結果は次のとおりです。
- 機能 1、2、および 3 を持つすべてのカメラを表示: C1
- 機能 1、2、および 4 を持つすべてのカメラを表示: C2
- 機能 1 と 2 を持つすべてのカメラを表示: C1、C2、C3
これが私がしたことです(動作しますが、本当に醜いので、使用したくありません):
SELECT * FROM camera c
WHERE c.id IN (
(SELECT c.id FROM camera c JOIN cameras_features f ON (c.id=f.camera_id)
WHERE f.feature_id=1)
q1 JOIN -- simple intersect
(SELECT c.id FROM camera c JOIN cameras_features f ON (c.id=f.camera_id)
WHERE f.feature_id=2)
q2 JOIN ON (q1.id=q2.id)
)