我有一个包含以下列的表
timetrack_id | timetrack_length | timetrack_rate | timetrack_parent
如果时间跟踪已经继续,timetrack_parent
会保留timetrack_id
,但如果时间跟踪没有,则会0
。
我想为每个timetrack_id拉回一行,但将timetrack_length
合并到timetrack_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
我会回来
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_parent
和SUM
timetrack_length
对行进行分组,但这也会将timetrack_parent
为0的行分组,这些行不相关。此查询也不会将timetrack_parent = timetrack_id
放在哪里。我也不确定是否总会返回 parent 行中的其他数据。
所以返回的是
1 | 20 | 20.00 | 0
4 | 35 | 20.00 | 1
6 | 6 | 30.00 | 3
有人可以提供一些方向吗?
答案 0 :(得分:1)
我认为这个查询应该有效。您需要将表连接到自身以获取父/子分组和&然后添加所有父行(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