0

私は3つのテーブルを持っています:

player [id, name]
attribute [id, name]
player_attribute [id, player_id, attribute_id, value]

各プレイヤーは異なる属性を持つことができますが、属性を持たないプレイヤーもいます。次に、特定の属性を持つプレーヤーを検索する必要があります。たとえば、番号が 11 で名前が John であるすべてのプレーヤーです。この時点で、これらの属性の ID もわかっwhereています。クエリの一部は次のようになります。WHERE (attribute.id, attribute.value) in ((5, '11'), (18, 'John'))

要求されたすべての属性を満たすすべてのプレーヤーを取得する必要があります。

問題は、クエリ全体がどのように見えるべきかわからないことです。結合、ネストされた選択、グループ化を試みましたが、機能させることができません。私はいつも行が多すぎるか、十分ではありません。

助けてください。

編集 aranid のおかげで解決策が見つかりました:

select player_id from (
    select * from player_attribute where (attribute.id, attribute.value) in ((5, '11'), (18, 'John'))) 
group by player_id
having count(*) = 2

したがって、キーワードはhaving by適切に使用されました:)上記のクエリをステートメント
に変換する方法はありますか?JOIN

4

2 に答える 2

2

私があなたの質問を正しく理解したことを願っています。player_idこれにより、属性を持つすべてのsと、次の属性(5, '11')を持つ別のsが返され(18, 'John')ます。

Select a1.player_id
From player_attribute a1
Join player_attribute a2 On ( a2.player_id = a1.player_id )
Where a1.attribute_id = 5 And a1.value = '11'
  And a2.attribute_id = 18 And a1.value = 'John'

これらの属性をplayerテーブルに保存しない特別な理由はありますか?

player (id, first_name, last_name, player_number, ...)

これにより、そのようなクエリがはるかに簡単になります

Select id
From player
Where first_name = 'John' And player_number = 11
于 2010-06-27T16:11:46.787 に答える
2

Entity-Attribute-Value 設計を使用していますが、これはどのリレーショナル データベースでも扱いにくいものです。

CouchDBMongoDBなどの新しい非リレーショナル データベースのいずれかを使用すると、おそらく満足できるでしょう。これらはドキュメント指向データベースであり、ユーザーが独自の属性を定義でき、データベースを設計する時点では属性がわからないというシナリオに合わせて設計されています。

于 2010-06-27T17:46:17.697 に答える