![](/img/trans.png)
[英]sql join issue, not able to retrieve records from table a which matches some condition in table b and all that Ids that present in table A
[英]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.