繁体   English   中英

需要使用JOIN来检索和的帮助,如果没有条目,则从RIGHT表中获取0

[英]Need assistance using a JOIN to retrieve sums, or 0 from the RIGHT table if there is no entry present

我需要以下查询的帮助。 我敢肯定,我想得太多了,但是这里是:

    SELECT 
        bc.name, 
        bc.category_id,
        bc.ref_id,
        COALESCE(bc.parent_id,bc.category_id) as parent_category_id,
        (select name FROM budget_categories bc2 WHERE bc2.category_id = bc.parent_id) as parent_name,
        (select ref_id FROM budget_categories bc2 WHERE bc2.category_id = bc.parent_id) as parent_ref_id, 
        COALESCE(sum(bee.amount),0) as amount
    FROM 
        budget_expected_expenses bee, budget_categories bc 
    WHERE 
        bc.group_id IN (1,139) AND
        bee.group_id = 1 AND
        bee.date BETWEEN '2012-01-01' AND '2012-01-31' AND 
        bee.cat_id = bc.category_id 
    GROUP BY bee.cat_id ORDER BY bc.ref_id ASC

基本上,目标是从“ bee”表中返回“ bc”表中的每个类别的总和(无论是由组还是总部创建的,本例中分别为1和139)。 如果“ bee”中没有针对特定组的条目,则需要它返回0。但是,此查询仅返回“ bee”表中实际具有条目的值的总和。 我确定有一些我想念的东西,但是,我想念了。 提前致谢。

注意:我尝试了各种JOINS,但似乎没有任何效果。 显然有可能,我只是一片空白。

FROM budget_expected_expenses bee, budget_categories bc 

如果您希望条目显示在bc但不一定是bee ,请执行LEFT JOIN:

FROM budget_categories bc LEFT JOIN budget_expected_expenses bee ON bc.category_id = bee.cat_id

您还需要按保证不为空的列进行分组:

GROUP BY bc.category_id

此外,交叉连接和复杂的子查询使查询变得比原来复杂得多。 您可以将其简化为以下形式:

SELECT 
    bc.name, 
    bc.category_id,
    bc.ref_id,
    COALESCE(bc.parent_id,bc.category_id) as parent_category_id,
    parent.name as parent_name,
    parent.ref_id as parent_ref_id, 
    COALESCE(sum(bee.amount),0) as amount
FROM 
    budget_categories bc
LEFT JOIN
    budget_expected_expenses bee ON bc.category_id = bee.cat_id
LEFT JOIN
    budget_categories parent ON bc.parent_id = parent.category_id
WHERE 
    bc.group_id IN (1,139) AND
    bee.group_id = 1 AND
    bee.date BETWEEN '2012-01-01' AND '2012-01-31'
GROUP BY bc.category_id ORDER BY bc.ref_id ASC

建议您重写查询以具有LEFT联接:

SELECT 
    ....
    COALESECE(SUM(bee.amount,0.00))
FROM
    budget_categories bc 
    LEFT JOIN
    budget_expected_expenses bee ON bee.cat_id = bc.category_id
WHERE 
    ...

对于联接左侧的每个记录,LEFT JOIN将始终以至少一个结果记录结尾。 如果没有匹配的右手记录,将使用NULL,这就是为什么需要COALESCE()将其转换为0.00的原因。

我使用的是比列表表的旧格式更新的ANSI样式,并在WHERE子句中显式添加了连接条件。 这样,您应该更好地了解每个表与其他表之间的关系以及要应用于这些JOINED元素的显式限制(例如日期条件)。 在where子句中仅包含针对select的第一个表的条件。

我曾经根据您的意图查找PARENT类别,名称和引用ID(如果存在父ID),将两个联接应用于类别表。 如果不是,它将查看找到的默认类别ID。

我认为我唯一遇到的问题是期望费用的合并,其中您的条件只有group_ID = 1,而您的预算类别条件是1或139(通过in子句)。 如果实际上应设置为相同,则将联接调整为

“ AND bc.group_ID = bee.group_ID”

最后,确认您要按以下类别分组的内容:原始类别或与其关联的父类别,但这也是您的电话。

SELECT 
      bc.name, 
      bc.category_id,
      bc.ref_id,
      COALESCE( bc.parent_id,bc.category_id) as Which_Category_id,
      COALESCE( bcParent.Name, bcDefCat.Name ) as Category_Name,
      COALESCE( bcParent.Ref_ID, bcDefCat.Ref_ID ) as Category_Ref_ID,
      COALESCE(sum(bee.amount),0) as amount
    FROM 
        budget_categories bc 

           LEFT JOIN budget_expected_expenses bee
              ON bc.category_id = bee.cat_id
              AND bee.group_ID = 1
              AND bee.date BETWEEN '2012-01-01' AND '2012-01-31' 

           LEFT JOIN budget_categories bcParent
              on bc.parent_ID = bcParent.category_ID

           JOIN budget_categories bcDefCat
              on bc.Category_ID = bcDefCat.category_ID
   WHERE 
      bc.group_id IN (1,139) 
   GROUP BY 
      bc.category_id 
   ORDER BY 
      bc.ref_id ASC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM