跨列按 id 分组

Grouping by id in across columns

我有一个 table 包含以下列

timetrack_id | timetrack_length | timetrack_rate | timetrack_parent

如果时间跟踪已经继续,timetrack_parent 持有 timetrack_id,但如果没有继续,则将是 0

我想为每个 timetrack_id 拉回一行,但合并 timetrack_lengthtimetrack_parent = timetrack_id。那么其余的值应该来自父行(其中 timetrack_parent = 0 并且行存在 timetrack_parent 这个 timetrack_id)。

所以对于下面的数据

timetrack_id | timetrack_length | timetrack_rate | timetrack_parent
-------------+------------------+----------------+-------------------
1            | 5                | 20.00          | 0
2            | 7                | 20.00          | 0
3            | 8                | 20.00          | 0
4            | 20               | 20.00          | 1
5            | 15               | 25.00          | 1
6            | 6                | 30.00          | 3

我会return

1 | 40 | 20.00 | 0
2 | 7  | 20.00 | 0
3 | 14 | 20.00 | 0

我有以下查询

SELECT `timetrack_id`, `timetrack_parent`, `timetrack_rate`, SUM(`timetrack_length`) 
FROM `timetrack` 
GROUP BY `timetrack_parent`, `timetrack_parent` = `timetrack_id`

这确实按 timetrack_parentSUMtimetrack_length 对行进行了分组,但是这也将 timetrack_parent 为 0 的行分组,它们不相关。此查询也不对 timetrack_parent = timetrack_id 进行分组。我也不确定 parent 行中的其他数据将始终被 returned。

那么 returned 是

1 | 20 | 20.00 | 0
4 | 35 | 20.00 | 1
6 | 6  | 30.00 | 3

有人可以提供一些指导吗?

我认为这个查询应该有效。您需要将 table 加入自身以获得 parent/child 分组,然后添加所有父行 (timetrack_parent=0) 然后进行分组。

SELECT id1 timetrack_id, sum(len) sumlength, timetrack_rate, timetrack_parent FROM
(
SELECT a.timetrack_id id1, b.* FROM timetrack a
JOIN timetrack b ON a.timetrack_id=b.timetrack_parent
UNION ALL
SELECT c.timetrack_id, c.* FROM timetrack c
WHERE c.timetrack_parent=0
ORDER BY 4
) z
GROUP BY 1