SQL:用户定义的列

时间:2018-02-13 08:49:27

标签: sql join mariadb entity-attribute-value

在我的应用程序中,我需要一个包含自定义列的成员列表。所以我创建了一个只有ID的成员表。 member_attributes表包含名称和类型(例如“Name”,“string”或“Birthday”,“date”)。在第三个表中,我有成员表的外键(member_id),属性表的外键(member_attribute_id)和属性的值。

  

成员:id,timestamps

     

member_attributes :id,name,type,timestamps

     

member_attribute_values :member_id,member_attribute_id,value

第一个问题:这是实现这一目标的正确方法。它到目前为止一直在运作。

第二个问题是如何选择所有属性,即使它们是空的。我尝试了一个正确的联接,但这不起作用:

SELECT * FROM member_attributes
RIGHT JOIN member_attribute_values on (member_attribute_values.member_attribute_id = member_attributes.id)
RIGHT JOIN members on (members.id = member_attribute_values.member_id)

检查这个小提琴: http://sqlfiddle.com/#!9/7e097b/1

2 个答案:

答案 0 :(得分:1)

您可以使用Cross joinSub-Query

来实现这一目标
SELECT * FROM (SELECT members.id as member_id, attributes.id as attributesid, name, type FROM attributes, members) as t
left join member_attribute_values as mav on t.member_id = mav.member_id and
t.attributesid = mav.member_attribute_id
order by t.member_id

SQL Fiddler:http://sqlfiddle.com/#!9/3799f/9

答案 1 :(得分:1)

另一种方法......

我在几个项目中做过类似的事情。我选择使用一个表作为属性名称和值,并使用该成员的外键。

  

member_attributes :id,memberId,name,type,value

     

memberId = members(id)

上的外键      

成员:id

然后,您只需通过简单的

为用户选择所有member_attributes行
select * from member_attributes where memberId = ?