【问题标题】:Find the level segments up-to 7-levels in parent-child hierarchy在父子层次结构中查找最多 7 个级别的级别段
【发布时间】:2020-12-30 07:46:55
【问题描述】:

父子表

id introducer_id name
1 NULL Riya
2 1 Ramesh
3 1 Anand
4 2 Preety
5 3 Rakesh

id = 1时查询成员列表

select  id AS memberid, name 
from (select * 
      from table_member 
      order by introducer_id, id) table_member_sorted,
     (select @pv := '1') initialisation 
where find_in_set(introducer_id, @pv) 
  and length(@pv := concat(@pv, ',', id))

以上查询显示输出

member_id name
2 Ramesh
3 Anand
4 Preety
5 Rakesh

现在我也想查询所有成员的等级 (即)我希望输出为:

member_id name level
2 Ramesh 1
3 Anand 1
4 Preety 2
5 Rakesh 2

如何更新我之前的查询以获得上述输出?

注意:查询最多显示7级

谢谢。

【问题讨论】:

  • ORDER BY 在子查询 table_member_sorted 将被忽略。
  • 指定精确的 MySQL 版本。
  • MySql 5.6 版

标签: mysql tree parent-child hierarchy depth


【解决方案1】:
CREATE PROCEDURE get_tree (start_from INT)
BEGIN
    DROP TABLE IF EXISTS tmp;
    CREATE TABLE tmp (member_id INT PRIMARY KEY, 
                      name VARCHAR(255),
                      level INT);
    INSERT INTO tmp SELECT id, name, 0
                    FROM test
                    WHERE id = start_from;
    REPEAT
        INSERT IGNORE INTO tmp SELECT test.id, test.name, tmp.level + 1
                               FROM test
                               JOIN tmp ON tmp.member_id = test.introducer_id;
    UNTIL !ROW_COUNT() END REPEAT;
    SELECT * FROM tmp;
END

fiddle


我已经分享了我的 sql 版本的截图链接。 snipboard.io/qbdB0A.jpg – AfreenB

您的 SQL 服务器版本是 MariaDB 10.4.14。 ——秋名

为您的服务器版本使用

WITH RECURSIVE
cte AS ( SELECT id member_id, name, 0 level
         FROM test
         WHERE id = @start_from 
       UNION ALL
         SELECT test.id, test.name, cte.level + 1
         FROM test
         JOIN cte ON cte.member_id = test.introducer_id 
      -- WHERE cte.level < 7 )
SELECT * 
FROM cte;

fiddle

【讨论】:

  • 谢谢你的回答,但是这个查询不支持我的sql版本,我已经分享了我的sql版本的截图链接。 snipboard.io/qbdB0A.jpg
  • @AfreenB 此查询不支持我的 sql 版本 ???这就是你的话:MySql 5.6 版 – AfreenB。成功工作的小提琴使用 MySQL 5.6.50 版本,其中没有任何可能在任何 5.6.x 版本上失败的构造。 我已经分享了我的 sql 版本的截图链接。 :facepalm: 你的 SQL server 版本是 MariaDB 10.4.14。我的代码可以在没有问题的情况下使用它:dbfiddle.uk/… 但绝对可以在此 DBMS 中使用另一种更有效的技术。
  • 感谢您的澄清,我尝试执行它。
  • @AfreenB 已添加对您的版本的查询。
  • 两个查询都执行成功。在递归查询中,我还想将级别限制为最大 7。请帮助我实现这一目标。
猜你喜欢
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
相关资源
最近更新 更多