2

写真用カメラを販売する 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 を持つすべてのカメラを表示: C1C2C3

これが私がしたことです(動作しますが、本当に醜いので、使用したくありません):

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)
)
4

3 に答える 3

5
SELECT camera.id
FROM camera JOIN camera_features ON camera.id=camera_features.camera_id
GROUP BY camera.id
HAVING sum(camera_features.feature_id IN (1,2,3))=3

3の機能の数です(1,2,3)(camera_id,feature_id)そして、は で一意であると仮定しcamera_featuresます。

于 2012-02-01T20:38:18.317 に答える
3
SELECT DISTINCT Camera.*
FROM Camera c
     INNER JOIN cameras_features fc1 ON c.id = fc1.camera_id AND fc1.feature_id = 1
     INNER JOIN cameras_features fc2 ON c.id = fc2.camera_id AND fc2.feature_id = 2

ここで起こっていることは、カメラが機能 1 を持つカメラにフィルターされ、次にこのグループ内で、カメラが機能 2 を持つカメラにフィルターされることです。

于 2012-02-01T20:38:39.477 に答える
1

これは、検索値をテーブルに入れることで一般化するのが最も簡単です...

INSERT INTO search SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3

SELECT
  camera_features.camera_id
FROM
  camera_features
INNER JOIN
  search
    ON search.id = camera_features.feature_id
GROUP BY
  camera_features.camera_id
HAVING
  COUNT(DISTINCT camera_features.feature_id) = (SELECT COUNT(DISTINCT id) FROM search)
于 2012-02-01T20:39:45.343 に答える