如果从子任务标记为空,则从父任务继承标记

时间:2016-08-01 19:21:56

标签: mysql sql group-by coalesce

我有两个表,我希望获得按标签分组的任务的记录分钟数的总和,大多数情况下子任务与父项具有相同的标记,但在某些情况下,它们没有。

如何获取按标记分组的记录分钟总和,包括子任务,因此如果它们没有标记,则会从父项继承标记。

任务

+-----+-----------+------+-------+------------+
| 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 |
+-----+---------+-------------+----------------+

1 个答案:

答案 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