从MySQL中的Select to CROSS JOIN CTE传递值

问题描述 投票:0回答:1

我在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: - 如果Parent Id为1(这意味着用户是由第一个祖先创建的)

  • 用户拥有parent_id 1,因此我们需要获取父1

案例#3: - 如果父ID是N(这意味着用户是由案例#2的第N个孩子创建的)

  • 用户有parent_id n(例如:user_id是6,n是4)所以我们需要找到根父,哪个是由第一个祖先创建的,最后答案是“user_id:2”(即Emma) 。

我尝试了以下代码:

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
1个回答
1
投票

我不认为这是最好的方法,因为它会在处理过程中花费你很多,并且可能成为以后为你的应用程序维护的噩梦。您应该只为数据库中的每个用户存储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

© www.soinside.com 2019 - 2024. All rights reserved.