2

Have issue with building a recursive query in Postgres.

Tried with this one but it doesn't seem to work. So table user have user_id and referred_by_user_id. referred_by_user_id can be empty, if it is empty we don't need to go up anymore.

So need to find all referrers above a user, going in dynamical depth. Current implementation with limit is naive, I would assume I can exit as soon as I reach X depth.

WITH RECURSIVE uplines(user_id, referred_by_user_id) AS (
 SELECT t.user_id, t.referred_by_user_id
 FROM postgres.user AS t
 WHERE t.user_id = $userId
 UNION ALL
 SELECT t.user_id, t.referred_by_user_id
 FROM postgres.user AS t JOIN uplines AS a ON t.user_id = a.referred_by_user_id
)
SELECT uplines.user_id FROM uplines LIMIT $depth;

Have read bunch of SO posts about it but still cannot get it to work.

asked Feb 24, 2018 at 12:33
1
  • It would help if you provided the table definition and sample data. You can use dbfiddle.uk and provide the link in the question. Commented Feb 24, 2018 at 12:44

1 Answer 1

3

I think what you want can be achieved by adding in the column list a "depth" or "level" that increases by one for each recursion:

WITH RECURSIVE uplines(user_id, referred_by_user_id, depth) AS (
 SELECT t.user_id, t.referred_by_user_id, 0
 FROM postgres.user AS t
 WHERE t.user_id = $userId
 UNION ALL
 SELECT t.user_id, t.referred_by_user_id, a.depth + 1
 FROM postgres.user AS t JOIN uplines AS a ON t.user_id = a.referred_by_user_id
 WHERE a.depth < $depth
)
SELECT user_id, depth
FROM uplines 
ORDER BY depth ;
answered Feb 24, 2018 at 12:49
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.