跨列按 id 分组
Grouping by id in across columns
我有一个 table 包含以下列
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
我会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_parent
和 SUM
和 timetrack_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
我有一个 table 包含以下列
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
我会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_parent
和 SUM
和 timetrack_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