0

我有三张桌子:

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')和另一个具有(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

您正在使用实体-属性-值设计,这对于任何关系数据库来说都是很尴尬的。

使用CouchDBMongoDB等新的非关系型数据库之一,您可能会更开心。这些是面向文档的数据库,专为您所拥有的场景而设计,用户可以在其中定义自己的属性,而您在设计数据库时并不知道这些属性。

于 2010-06-27T17:46:17.697 回答