任何知道如何在1个查询中处理自定义组计算方案的Mysql大师?

时间:2010-10-06 22:06:41

标签: sql mysql

我希望从我的解释中得出任何意义。我能够创建查询,但是我的查询仅适用于与容器相关的项目,并且只有在不超过一个项目相关时才有效。我真的希望任何人都可以提供帮助!

请考虑以下对象:

  • 容器
  • 项目

我有一个表,其中存储了所有对象的实例。该表使用自引用的父子结构,因此在技术上可以将Container'置于'Person内(仅提及,这不会发生)。

  • Object_Instances
    • 的objectid
    • parentId的
    • typeid的
    • typespecification(与containerid相同,personid或itemid =>三个中的一个被填充)
    • 数据筒
    • PERSONID
    • 的itemid

我有两个表可用于将人/物品链接到容器:

  • Container_Person

    • 数据筒
    • PERSONID
    • 金额
    • 必需(布尔)
  • Container_Item

    • 数据筒
    • 的itemid
    • 金额
    • 必需(布尔)

(还有一个 / * 项目 *表)

现在,对于容器的实例,我想计算一个介于0和1之间的数字,该数字基于相关的Container_Person和Container_Item规范,方法如下:

  • 如果没有Container_Person / Container_Item与Container =>相关结果= 1
  • 如果相关记录,则应按以下方式考虑这些记录:
    • 如果容器不包含(具有子记录)所有所需的相关人员/项目 =>结果0
    • 否则:
    • 结果=平均值基于:
    • (与Container_xxx关系中的#child record vs amount
    • 如果有超过1个人或项目与容器相关,那么(#records vs amount)值的'weight'应该是该Container的相关Container_xxx.amount值之间的比率。

这是我目前的'解决方案':

此查询仅适用于容器的一个相关项。它不会以任何方式考虑人员......如果多个项目与容器相关,则查询将返回多个记录。

所以我的实际问题是:如何根据_Person / _Item相关数量/所需规格对以下查询的结果进行分组/求和(计算为0 - 1十进制)?

SELECT
    Container.name,
    Item.name,
    (ifnull(Sum(Object_Instance.amount),0) / Container_Item.amount) as value
FROM
    Container
    Inner Join Object_Instances as Containers 
        ON Containers.typeid = 'container' 
        AND Container.containerid = Containers.typespecification
    Left Outer Join Container_Item ON Container_Item.containerid = Container.containerid
    Left Outer Join Item ON Item.itemid = Container_Item.itemid
    Left Outer Join Object_Instance as ContainerItems 
        ON Item.itemid = ContainerItems.typespecification 
        AND ContainerItems.typeid = 'item'
        AND ContainerItems.parentid = Containers.objectid
WHERE Containers.objectid = 1
GROUP BY 
    Container.name,
    Container_Item.amount,
    Item.name,
    Container.containerid

1 个答案:

答案 0 :(得分:0)

在进行复杂的连接和分组时,我经常不得不求助于这种类型的查询:

  • 创建分组(或唯一)列表
  • 在新查询中,获取分组列表,然后加入一个未分组的列表,该列表提供了所需的其他详细信息。