基于复合设计模式的数据库mysql查询

基于复合设计模式的数据库mysql查询,mysql,Mysql,我不是SQL专家,因此在设计一个mysql查询来查询使用复合设计模式设计的数据库表时遇到了麻烦 各表如下: 复合材料: id、名称、类型[类型为条件或条件组] 复合材料性能: id、复合id、属性id 分组: id,父id,子id 属性:id、键、值 我要做的是生成一个查询,该查询将返回组的ConditionGroup成员条件的唯一属性,这样我将得到一个组名和从成员条件继承的属性键列表 我想到的最好的办法是: SELECT DISTINCT properties.`key`, composite

我不是SQL专家,因此在设计一个mysql查询来查询使用复合设计模式设计的数据库表时遇到了麻烦

各表如下:

复合材料: id、名称、类型[类型为条件或条件组]

复合材料性能: id、复合id、属性id

分组: id,父id,子id

属性:id、键、值

我要做的是生成一个查询,该查询将返回组的ConditionGroup成员条件的唯一属性,这样我将得到一个组名和从成员条件继承的属性键列表

我想到的最好的办法是:

SELECT DISTINCT properties.`key`, composites.name  
FROM composites, composites_properties, properties  
WHERE composites.id=composites_properties.composite_id
AND properties.id=composites_properties.property_id  
AND composites.id IN (
    SELECT child_id FROM groupings WHERE parent_id IN
        (SELECT id FROM composites WHERE type='ConditionGroup')
    )
这将生成每个成员条件及其属性列表,如果多个成员条件具有该属性,则这些属性将在其中重复

最后,我想:

组名

财产(1)

财产2

财产3

但是我得到了下面的类型列表,没有指出这些条件属于哪一组

条件名称1属性_1

条件名称1属性_2

条件名称1属性_3

条件名称2属性_1

条件名称2属性_2

条件名称3属性_1

条件名称3属性_2


有什么建议吗?

老实说,我有点不清楚你到底想做什么,但我会试一试。如果你能澄清这个查询为什么不能满足你的要求,我可能会进一步提供帮助

SELECT      c.name, p.key
FROM        composites c
INNER JOIN  groupings g ON c.id = g.parent_id
INNER JOIN  composites_properties cp ON cp.composite_id = g.child_id
INNER JOIN  properties p ON p.id = cp.property_id
WHERE       c.type = 'ConditionGroup'

对我来说,这似乎不是世界上最好的查询,因为它忽略了每个分组中的孩子实际上是什么,所以我不确定这是否是您想要的。

哦,哇。我根本没有这样想。我认为我必须在循环中做很多循环,这让事情变得更加困难。在p.key中添加DISTINCT使我非常接近,如果不是这样的话。谢谢@实际上,整个SELECT子句加上末尾按c.name、p.key排序的顺序在实践中可能更接近。不过,要确保这确实给了你想要的结果。例如,您想知道作为“ConditionGroup”类型复合的子项的复合的名称吗?只是一个想法。从条件的角度来看,我可以得到我想要的一切,它属于哪些组及其属性,但我很难弄清楚如何确定从孩子那里继承的组的属性。我觉得你写的很接近。我只需要确保当一个条件属于多个组时,继承的属性仍然会被反映出来。我将尝试在整个子句中添加DISTINCT和ORDERBY。再次感谢。@stuck_in_a_循环我认为继承的属性将反映出来,即使条件属于多个组。但是,我看不到复合上直接包含的属性,如果您知道条件组永远不会直接包含属性,那么这不是问题。但是,如果不是这样,您将遇到问题。而且,这个查询看起来只有一层深度;如果条件组的任何子级也具有具有属性的子级,则它们将不会反映在此查询中。