如果子任务的标签为空,则继承父任务的标签
If tag from subtask empty, inherit tag from parent task
我有两个表,我想获取按标签分组的任务的记录分钟数总和,大多数情况下,子任务与父任务具有相同的标签,但在某些情况下,它们不t.
我如何获得按标签分组的记录分钟数总和,包括子任务,这样如果他们没有标签,他们就会从父级继承标签。
任务
+-----+-----------+------+-------+------------+
| 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 |
+-----+---------+-------------+----------------+
基本上你需要使用 COALESCE()
函数,它 returns 在列表中找到第一个非空值(如果只有空值,它的计算结果为空)。
从派生的 table(查询的内部部分)获得有关标签的信息后,您可以将该信息加入 times
table 以计算每个标签的总和标签。
我没有测试过代码,但我相信它应该可以工作 - 这假设您的关系只有 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
我有两个表,我想获取按标签分组的任务的记录分钟数总和,大多数情况下,子任务与父任务具有相同的标签,但在某些情况下,它们不t.
我如何获得按标签分组的记录分钟数总和,包括子任务,这样如果他们没有标签,他们就会从父级继承标签。
任务
+-----+-----------+------+-------+------------+
| 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 |
+-----+---------+-------------+----------------+
基本上你需要使用 COALESCE()
函数,它 returns 在列表中找到第一个非空值(如果只有空值,它的计算结果为空)。
从派生的 table(查询的内部部分)获得有关标签的信息后,您可以将该信息加入 times
table 以计算每个标签的总和标签。
我没有测试过代码,但我相信它应该可以工作 - 这假设您的关系只有 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