Самостоятельно соединяя две таблицы через третью таблицу - PullRequest
0 голосов
/ 26 августа 2018

У меня интересная ситуация, когда записи таблицы сложно связаны друг с другом с помощью комбинации столбцов в другой таблице.

У меня есть entity таблица

entity_id | owner_id | title        | entity_type |  
    --------------------------------------------
       1  |     3    | some title 1 | supertype
       2  |     2    | some title 2 | supertype
       3  |     2    | some title 3 | supertype
       4  |     5    | title 1      | type_1
       5  |     5    | title 2      | type_2
       6  |     5    | title 3      | type_3

Тогда у меня есть другая таблицакоторый хранит различные свойства в стиле ключ-значение

Таблица entity_properties:

property_id | entity_id | property_key | property_value
   112        | 1         | identifier   | type_1
   124        | 2         | identifier   | type_2
   146        | 3         | identifier   | type_3
   634        | 1         | is_cool      | 0
   135        | 2         | is_cool      | 1
   23         | 3         | is_cool      | 1

Теперь я хочу выбрать сущности с entity_type, имеющие значения type_1, type_2, type_3, а также имеет столбец property_value из entity_properties, в котором будет отображаться is_cool параметр объекта, который имеет property_key = identifier со свойством property_value, которое соответствует типу объекта моих искомых элементов из entity таблица.

желаемые результаты:

  entity_id | owner_id | title      | entity_type | property_value 
    ----------------------------------------------------------------
         4  |     5    | title 1    | type_1      |  0  
         5  |     5    | title 2    | type_2      |  1
         6  |     5    | title 3    | type_3      |  1

Я несколько дней бью головой об эту, и это лучшее приближение, которое не работает ...

SELECT
    sought.*,
    entity_properties.property_value
FROM
    entity AS sought
INNER JOIN
    entity AS entity_type
JOIN
    entity_properties AS properties
ON
    properties.entity_id = entity_type.entity_id
WHERE
    sought.owner_id = 5 AND sought.entity_type IN(
        'type_1',
        'type_2',
        'type_3') 
AND properties.property_key = 'is_cool' 

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете использовать два соединения для entity_properties

select e.entity_id, e.owner_id, e.title, e.entity_type, p2.property_value 
from entity  e 
inner join  entity_properties p1 on e.entity_type  = p1.property_value 
          and p1.property_key ='indentifier'
inner join  entity_properties p2 on p1.entity_id  = p2.entity_id 
          and p2.property_key ='is_cool'
0 голосов
/ 26 августа 2018

Похоже, как настроены ваши данные, ваш запрос будет работать только для идентификаторов сущностей 1, 2 и 3, поскольку в столбце entity_id второй таблицы entity_properties нет 4, 5, 6.Если вы переключились на присоединение к property_id, вы должны получить то, что ищете, хотя это может быть «неправильно» в зависимости от того, как устроена ваша база данных.

SELECT sought.*, entity_properties.property_value FROM entity AS sought INNER JOIN entity AS entity_type JOIN entity_properties AS properties ON properties.property_id = entity_type.entity_id WHERE sought.owner_id = 5 AND sought.entity_type IN( 'type_1', 'type_2', 'type_3') AND properties.property_key = 'is_cool'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...