这是我的回答。它不是很好,但它的工作原理。第一个查询是针对带有序列引擎的 MariaDB,较长的是来自“普通”MySQL
开始参数(id)必须在这里设置@sid := 8
MariaDB
SELECT path, sid
FROM (
SELECT *, @sid AS sid, @path := CONCAT(@path,' -> ', @sid) AS path,
(SELECT (@sid:=parent) FROM mytab WHERE id = @sid) AS parent
FROM seq_1_to_99
CROSS JOIN ( SELECT @sid := 8 , @path :=@sid) AS parameter
HAVING parent = @sid
) AS result
ORDER BY seq DESC
LIMIT 1;
MySQL
SELECT path, sid FROM (
SELECT *, @sid AS sid,
@path := CONCAT(@path,' -> ', @sid) AS PATH,
(SELECT (@sid:=parent) FROM mytab WHERE id = @sid) AS parent
FROM (
SELECT *
FROM (
SELECT d2.a*10+d1.a AS nr
FROM (
SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL
SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL
SELECT 8 UNION ALL SELECT 9) AS d1
CROSS JOIN (
SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ) AS d2
) AS counter
ORDER BY counter.nr
) AS result
CROSS JOIN ( SELECT @sid := 8 , @path :=@sid) AS parameter
HAVING parent = @sid
) AS p
ORDER BY nr DESC
LIMIT 1;
样本
MariaDB []> select * from mytab;
+----+--------+
| id | parent |
+----+--------+
| 1 | NULL |
| 2 | 3 |
| 3 | NULL |
| 4 | NULL |
| 5 | 4 |
| 6 | 5 |
| 7 | 8 |
| 8 | 6 |
+----+--------+
8 rows in set (0.00 sec)
MariaDB []> SELECT path, sid
-> FROM (
-> SELECT *, @sid AS sid, @path := CONCAT(@path,' -> ', @sid) AS path,
-> (SELECT (@sid:=parent) FROM mytab WHERE id = @sid) AS parent
-> FROM seq_1_to_99
-> CROSS JOIN ( SELECT @sid := 8 , @path :=@sid) AS parameter
-> HAVING parent = @sid
-> ) AS result
-> ORDER BY seq DESC
-> LIMIT 1;
+-------------+------+
| path | sid |
+-------------+------+
| 8 -> 6 -> 4 | 4 |
+-------------+------+
1 row in set (0.01 sec)
MariaDB []> SELECT path, sid FROM (
-> SELECT *, @sid AS sid,
-> @path := CONCAT(@path,' -> ', @sid) AS PATH,
-> (SELECT (@sid:=parent) FROM mytab WHERE id = @sid) AS parent
->
-> FROM (
-> SELECT *
-> FROM (
-> SELECT d2.a*10+d1.a AS nr
-> FROM (
-> SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL
-> SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL
-> SELECT 8 UNION ALL SELECT 9) AS d1
-> CROSS JOIN (
-> SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ) AS d2
-> ) AS counter
-> ORDER BY counter.nr
-> ) AS result
-> CROSS JOIN ( SELECT @sid := 8 , @path :=@sid) AS parameter
-> HAVING parent = @sid
-> ) AS p
-> ORDER BY nr DESC
-> LIMIT 1;
+-------------+------+
| path | sid |
+-------------+------+
| 8 -> 6 -> 4 | 4 |
+-------------+------+
1 row in set (0.01 sec)
MariaDB []>
希望对你有所帮助。