user380527
user380527

Reputation: 1597

MySQL Group By Lowest Common Parent ID

I have a single table that contains an ID, Amount, and Parent_ID. (It is a little more complex in reality, but this is all the important columns for this example). Basically what i want to do is group and sum the Amount column by the lowest common Parent (ie the ones who's parent id is NULL).

ID  Amount  Parent_ID
1   100     NULL
2   150     1
3   50      1
4   75      3
5   25      4
6   125     NULL
7   50      6
8   50      7
9   100     8

Expected results:

ID  SUM
1   400
6   325

As you can see, it only retuns two records, the ones who dont have a parent, meaning they are top level items. The Sum column is the sum of all of its children's Amount recursively, so ID = 1 is the sum of 1,2,3,4 and 5. and ID = 6 is the sum of 6,7,8, and 9.

Upvotes: 3

Views: 368

Answers (2)

mellamokb
mellamokb

Reputation: 56779

If you can define a limit to the number of levels in your hierarcy, you can extend this solution to an arbitrary number of levels:

select
    coalesce(t5.ID,t4.ID,t3.ID,t2.ID,t1.ID) as Root,
    sum(t1.Amount) as Amount
from Table1 t1
left join Table1 t2 on t1.Parent_ID = t2.ID
left join Table1 t3 on t2.Parent_ID = t3.ID
left join Table1 t4 on t3.Parent_ID = t4.ID
left join Table1 t5 on t4.Parent_ID = t5.ID
group by Root

Just add more left join as needed and add them to the list of columns in the coalesce.

Demo: http://www.sqlfiddle.com/#!2/b7a79/17

Upvotes: 6

D Mac
D Mac

Reputation: 3809

To achieve what you're looking for, you'll need a recursive stored procedure because you don't want something that will limit you to how deep the structure goes.

I think it would be easier to change your data structure. Add a column that relates each child to its top level parent. That way you can get what you want with a simple GROUP BY.

Upvotes: 0

Related Questions