【发布时间】:2019-08-10 21:57:31
【问题描述】:
我在 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:
- 用户的 parent_id 为 null,因此这是第一个用户,它没有任何父/祖先
案例#2:- IF Parent Id 为 1(这意味着用户是由第一个祖先创建的)
- 用户的parent_id为1,所以我们需要取parent 1
案例#3:- IF Parent Id 为 N(这意味着用户是由案例 #2 的第 N 个孩子创建的)
- 用户的 parent_id 为 n(例如:user_id 为 6,n 为 4),因此我们需要找到由第一个祖先创建的根父节点,最后答案是“user_id : 2”(即,艾玛)。
我尝试了以下代码:
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 中传递一个值,其中条件来自上述查询以及如何实现请求的输出。
【问题讨论】:
标签: mysql where common-table-expression cross-join select-query