I'm making a list of users with their referred users, with unknown levels deep.
What I did for now is to take three levels deep using:
SELECT
*
FROM (
SELECT
d1.id AS d1_id, d2.id AS d2_id, d3.id AS d3_id
FROM users AS d1
LEFT JOIN users AS d2 ON d2.referral_id = d1.id
LEFT JOIN users AS d3 ON d3.referral_id = d2.id
WHERE d1.agent_id = 12
) AS ut
Which results to:
+-------+-------+-------+
| d1_id | d2_id | d3_id |
+-------+-------+-------+
| 12 | 4 | NULL |
+-------+-------+-------+
| 12 | 9 | NULL |
+-------+-------+-------+
| 12 | 10 | NULL |
+-------+-------+-------+
| 12 | 18 | 20 |
+-------+-------+-------+
| 12 | 18 | 21 |
+-------+-------+-------+
| 12 | 18 | 23 |
+-------+-------+-------+
| 12 | 18 | 26 |
+-------+-------+-------+
| 12 | 19 | 22 |
+-------+-------+-------+
| 16 | 13 | NULL |
+-------+-------+-------+
| 16 | 17 | NULL |
+-------+-------+-------+
Now I need to get all the subs of all D1 using JSON_OBJECT
:
SELECT
JSON_OBJECT('id', ut.d1_id, 'members', JSON_ARRAYAGG(JSON_OBJECT('id', ut.d2_id))) AS tree
FROM (
SELECT
d1.id AS d1_id, d2.id AS d2_id, d3.id AS d3_id
FROM users AS d1
LEFT JOIN users AS d2 ON d2.referral_id = d1.id
LEFT JOIN users AS d3 ON d3.referral_id = d2.id
WHERE d1.agent_id = 12
) AS ut
GROUP BY ut.d1_id
Resulting to
+-----------------------------------------------------------------------------------------------------------------------+
| tree |
+-----------------------------------------------------------------------------------------------------------------------+
| {"id": 12, "members": [{"id": 4}, {"id": 9}, {"id": 10}, {"id": 18}, {"id": 18}, {"id": 18}, {"id": 18}, {"id": 19}]} |
+-----------------------------------------------------------------------------------------------------------------------+
| {"id": 16, "members": [{"id": 13}, {"id": 17}]} |
+-----------------------------------------------------------------------------------------------------------------------+
But the problem with this is I cannot get the d3
users.
Expected output:
{"id": 16, "members" : [{"id": 13, members: {...}}, {"id": 17, members: {...}}]} }
My MySQL version is 8.0.21-0ubuntu0.20.04.4
PS. I've read about this but I can't/don't know how to apply it in my scenario.