【问题标题】:Pass values from a Select to CROSS JOIN CTE in MySQL在 MySQL 中将值从 Select 传递到 CROSS JOIN CTE
【发布时间】: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


    【解决方案1】:

    我认为这不是最好的方法,因为它会花费您大量的处理成本,并且可能会成为您以后维护应用程序的噩梦。您应该简单地将每个用户的根用户存储在数据库中(这是大多数树系统处理此问题的方式)。 您的表结构将变为: 用户 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

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 1970-01-01
      • 2021-09-20
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 2012-05-10
      • 1970-01-01
      相关资源
      最近更新 更多