SQL - как выбрать все связанные строки с внешними (?) Условиями - PullRequest
0 голосов
/ 27 июня 2010

У меня есть три стола:

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

каждый игрок может иметь разные атрибуты, некоторые из них не имеют никаких.Теперь мне нужно искать игроков с определенными атрибутами, например, всех игроков с номером 11, и их имя - Джон.На данный момент я также знаю идентификаторы этих атрибутов, 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?

Ответы [ 2 ]

2 голосов
/ 27 июня 2010

Вы используете конструкцию Entity-Attribute-Value, и это просто неудобно для любой реляционной базы данных.

Возможно, вам будет удобнее использовать одну из новых нереляционных баз данных, например CouchDB или MongoDB .Это документно-ориентированные базы данных , разработанные специально для вашего сценария, в котором пользователи могут определять свои собственные атрибуты, а вы не знаете атрибуты во время проектирования базы данных.

2 голосов
/ 27 июня 2010

Надеюсь, я правильно понял ваш вопрос.Это должно вернуть все 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...