通过第三张桌子自动加入两张桌子

时间:2018-08-26 19:28:22

标签: mysql join

当一个表的记录通过另一个表中的列组合彼此复杂地关联时,我有一个有趣的情况。

我有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

现在,我要选择的实体具有类型为type_1type_2type_3的实体类型,并且还具有{{1 }}会显示实体property_value的参数,该实体的entity_properties = is_cool的property_value与我从property_key表中查找的项目的实体类型相匹配。

所需结果:

identifier

几天来我一直在b撞我的头,这是无法正常工作的最佳近似值...

entity

2 个答案:

答案 0 :(得分:1)

看起来像是您的数据设置方式,您的查询仅适用于实体ID 1、2和3,因为第二个entity_properties表的entity_id列中没有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'

答案 1 :(得分:1)

您可以在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'