Here is how you can do it with MySQL query. No need to use PHP for this:
SELECT
Id,
rep_id
FROM(
SELECT
@r AS _id,
(SELECT @r := Id FROM posts WHERE rep_id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r :=23785, @l := 0) vars,posts m
WHERE @r <> 0) T1
JOIN posts T2
ON T1._id = T2.Id
GROUP BY Id
ORDER BY T1.lvl DESC;
OUTPUT
| ID | REP_ID |
|-------|--------|
| 25704 | 25060 |
| 25060 | 24419 |
| 24419 | 23785 |
| 23785 | 0 |
SQL Fiddle Demo
Take a look at this
(SELECT @r :=23785, @l := 0) vars,
You just need to provide starting id as i have provided 23785
With id 25060
OUTPUT
| ID | REP_ID |
|-------|--------|
| 25704 | 25060 |
| 25060 | 24419 |
SQL Fiddle Demo
More details about how this works can be found here.
If you want to provide some middle id then use this query
SELECT
*
FROM (
(
SELECT
num,
Id,
rep_id
FROM(
SELECT
@r AS _id,
(SELECT @r := Id FROM posts WHERE rep_id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r :=25060, @l := 0) vars,posts m
WHERE @r <> 0) T1
JOIN posts T2
ON T1._id = T2.Id
GROUP BY Id
ORDER BY T1.lvl DESC
) UNION (
SELECT
num,
Id,
rep_id
FROM(
SELECT
@r AS _id,
(SELECT @r := MAX(rep_id) FROM posts WHERE Id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r :=25060, @l := 0) vars,posts m
WHERE @r <> 0) T1
JOIN posts T2
ON T1._id = T2.Id
GROUP BY Id
ORDER BY T1.lvl DESC )
)l
ORDER BY num
SQL Fiddle Demo
OUTPUT
| NUM | ID | REP_ID |
|-----|-------|--------|
| 1 | 25704 | 25060 |
| 2 | 25060 | 24419 |
| 3 | 24419 | 23785 |
| 4 | 23785 | 0 |