3

次の簡略化されたスキーマを持つ複数の属性を持つエンティティがあります。

実在物:

  • 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)。迅速な解決策は何ですか?

4

1 に答える 1

0

まあ、3つのクエリとそれらのユニオンを実行できます。それが最速の(最も簡単な)方法です

高速な方法が必要な場合...サブクエリでexistsを使用する場合、existsの考え方は、一致する最初のアイテムでtrueを返すということです...したがって、この方法で内部結合と複数のwhere節を避けることになります

于 2012-09-01T23:58:10.147 に答える