我有两个表,我希望获得按标签分组的任务的记录分钟数的总和,大多数情况下子任务与父项具有相同的标记,但在某些情况下,它们没有。
如何获取按标记分组的记录分钟总和,包括子任务,因此如果它们没有标记,则会从父项继承标记。
任务
+-----+-----------+------+-------+------------+
| id | parent-id | name | tag | is-subtask |
+-----+-----------+------+-------+------------+
| 001 | | a | sales | 0 |
| 002 | 001 | b | sales | 1 |
| 003 | 001 | c | | 1 |
| 004 | | d | store | 0 |
+-----+-----------+------+-------+------------+
次
+-----+---------+-------------+----------------+
| id | task-id | description | logged-minutes |
+-----+---------+-------------+----------------+
| 991 | 001 | Time for a | 15 |
| 992 | 002 | Time for ab | 60 |
| 993 | 002 | Time for ab | 75 |
| 994 | 003 | Time for ac | 35 |
| 995 | 004 | Time for d | 20 |
+-----+---------+-------------+----------------+
答案 0 :(得分:0)
基本上你需要使用COALESCE()
函数来返回列表中找到的第一个非空值(如果只有空值,则计算为null)。
在从派生表(查询的内部)获得有关标签的信息后,您可以将该信息加入times
表以计算每个标签的总和。
我没有测试过代码,但我相信它应该可行 - 这假设你的关系只有1级深度。如果您有更深层次结构,请查看How to create a MySQL hierarchical recursive query以查看对此代码的一些调整。
SELECT
alltasks.tag
, SUM( times.logged-minutes ) AS logged-minutes
FROM (
-- take parent tasks
SELECT
tparent.id
, tparent.tag
FROM task tparent
UNION
-- take child tasks
SELECT
tchild.id
, COALESCE( tchild.tag, tparent.tag ) -- if no child tag, use parent tag
FROM task tparent
INNER JOIN task tchild ON
tparent.id = tchild.parent-id
AND tchild.is-subtask = 1 -- may not be necessary unless you have different relationships
) alltasks
LEFT JOIN times ON
alltasks.id = times.task-id
GROUP BY alltasks.tag