在我的应用程序中,我需要一个包含自定义列的成员列表。所以我创建了一个只有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
答案 0 :(得分:1)
您可以使用Cross join
和Sub-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 = ?