次の簡略化されたスキーマを持つ複数の属性を持つエンティティがあります。
実在物:
- ID
属性:
- ID
- 名前
エンティティ属性:
- entity_id
- attribute_id
「男性」という名前の属性を持つレコードを取得したい場合は、次のように記述できます。
SELECT * FROM Entity
INNER JOIN entity_attribute ON ...
INNER JOIN Attribute ON ...
WHERE Attribute.name = 'male'
「男性」または「教師」という名前の属性を持つレコードを取得したい場合は、次のように記述できます。
SELECT * FROM Entity
INNER JOIN entity_attribute ON ...
INNER JOIN Attribute ON ...
WHERE Attribute.name = 'male' OR Attribute.name = 'teacher'
「男性」という名前の属性と「教師」という名前の属性を持つレコードを取得したい場合は、次のように記述できます。
SELECT *, COUNT(*) AS cnt FROM Entity
INNER JOIN entity_attribute ON ...
INNER JOIN Attribute ON ...
WHERE Attribute.name = 'male' OR Attribute.name = 'teacher'
HAVING cnt = 2
ここで、トリッキーな部分が来ます。私のクエリには、manytomany クエリを含めand
て組み合わせる必要があります。or
例:
[(属性「男性」を持つ) および (属性「教師」を持つ、または属性「庭師」を持つ) および (属性「好きなリンゴ」を持つ、または属性「好きなオレンジ」を持つ、または属性「 likes_cherry')]。
サブクエリを使用することは解決策になる可能性がありますが、私の知る限り、それは遅くなります (エンティティが最大 10000、属性が最大 30、エンティティ属性が最大 15000)。迅速な解決策は何ですか?