我在MySQL数据库中有一个表,即“用户”
CREATE TABLE `users` (
`user_id` int NOT NULL,
`name` varchar(100) NOT NULL,
`parent_user_id` int
);
INSERT INTO `users` (`user_id`, `name`, `parent_user_id`) VALUES
(1, 'John', null),
(2, 'Emma', 1),
(3, 'Watson', 2),
(4, 'Peter', 3),
(5, 'Rose', 1),
(6, 'Harry', 4),
(7, 'Jim', 6),
(8, 'Jack', 5),
(9, 'Josh', 8),
(10, 'Jem', 9);
我需要查询表users
,最顶级的祖先不是root用户(即root用户是1
)
预期产出:
user_id name root_parent_user_id root_parent_user_name
______________________________________________________________
1 John null null
2 Emma 1 John
3 Watson 2 Emma
4 Peter 2 Emma
5 Rose 1 John
6 Harry 2 Emma
7 Jim 2 Emma
8 Jack 5 Rose
9 Josh 5 Rose
10 Jem 5 Rose
要求的逻辑:
案例#1 - 如果父ID为NULL:
案例#2: - 如果Parent Id为1(这意味着用户是由第一个祖先创建的)
案例#3: - 如果父ID是N(这意味着用户是由案例#2的第N个孩子创建的)
我尝试了以下代码:
SELECT * FROM users USR
CROSS JOIN (
WITH RECURSIVE cte (user_id, name, parent_user_id) AS
(
SELECT user_id, name, parent_user_id
FROM users
WHERE user_id = USR.user_id
UNION ALL
SELECT c.user_id, c.name, c.parent_user_id
FROM cte AS cp JOIN users AS c
ON cp.parent_user_id = c.user_id
)
SELECT * FROM cte where parent_user_id = 1
) PUSR ON 1 = 1;
我通过错误错误代码:1054。'where子句'中的未知列'USR.user_id'
请帮助我如何在CTE中传递一个值,其中上述查询中的条件以及如何实现请求的输出。
我不认为这是最好的方法,因为它会在处理过程中花费你很多,并且可能成为以后为你的应用程序维护的噩梦。您应该只为数据库中的每个用户存储root用户(这是大多数树系统处理此问题的方式)。您的表结构将变为:user_id |名字| parent_user_id | root_user_id
如果你真的想坚持这种方式,我建议你检查一下(你只需要添加你的“非用户1根”条件):https://dba.stackexchange.com/questions/7147/find-highest-level-of-a-hierarchical-field-with-vs-without-ctes/7150