我有一个包含以下架构的数据库:
thing_attribute_value
Thing有许多Thing_Attributes加入thing.id_thing_type = thing_attribute.id_thing_type
thing_attribute.id = thing_attribute_value.id_thing_attribute
上加入了一个Thing_Attribute_Value 我正在尝试编写一个查询,该查询将返回特定事物记录(具有某个name
)的特定属性(具有某个id
)的值。 thing.id
代表一个独特的行。
换句话说,thing_attribute
和thing
都有id_thing_type
。这些表格需要在id_thing_type
= id_thing_type
上加入。考虑到这一点,因为每种类型的thing
都有自己独特的thing_attributes
集。任务是找到特定事物的特定属性的值。
这是我到目前为止所做的,但它会返回许多行:
SELECT t.id, tav.value_date
FROM thing_attribute_value tav
JOIN thing_attribute ta
ON tav.id_node_attribute = ta.id
JOIN thing t
ON ta.id_thing_type = t.id_thing_type
WHERE ta.name = 'Birth Date'
AND t.id = '123'
这是一个示例结果。如您所见,返回了许多行,所有行都具有thing
的相同ID,但具有不同的日期。
123,2015-12-02
123,2014-11-02
123,2013-07-11
123,2014-03-12
etc....
答案 0 :(得分:0)
所以,正如我原来答案的评论中所讨论的那样:
Thing有一个Thing_Type_Id列。 并且Thing_Attribute有一个Thing_Type_Id列。 与之有1:1的关系。
Thing_Attribute有一个Thing_Attribute_Value_Id列。 并且Thing_Attribute_Value有一个Id列。 其中有1 ::多种关系。
这是导致查询失败的原因。错误实际上在您的数据关系中,而不是查询。
让我们尝试将它拼凑在一起:
事 - 需要一个独特的身份证 - 可以包含任意数量的其他列 - 将有许多属性,但此列不在此表中
Thing_Attributes - 需要一个独特的身份证 - 需要一个东西(fk to Thing) - 需要一个Type id(fk到Thing_Attribute_Type) - 需要一个价值
Thing_Attribute_Value - 可以消失 - 用类型
的查找替换它Thing_Attribute_Type - 需要独特的身份证 - 需要价值
使用这种关系结构,每个Thing都可以拥有许多属性 您为属性类型使用id字段,因此您不会重复字符串。 使用基于Id获取Attribute_Type值的查找。
这是对您当前关系模型的彻底改革,但是对于您当前的关系模型,您无法将给定的属性值与给定的Thing隔离,我认为这至少是构建Thing对象的目标之一。