【问题标题】:Question Versions using CTE RECURSION MYSQL使用 CTE RECURSION MYSQL 的问题版本
【发布时间】:2022-10-16 01:29:57
【问题描述】:

问题: 用于测试程序员的应用程序包含初始问题版本和更新的问题版本,由以下模式表示:

CREATE TABLE questions ( 
    id INTEGER NOT NULL PRIMARY KEY, 
    name VARCHAR(50) NOT NULL, 
    childId INTEGER, 
    FOREIGN KEY (childId) REFERENCES questions (id) 
); 

INSERT INTO questions (id, name, childId) 
VALUES 
(3, 'SQL select v3', NULL), 
(2, 'C# tuples', NULL), 
(1, 'SQL select v2', 3), 
(0, 'SQL select', 1);

最新的问题版本将 childId 设置为 NULL,其他问题版本将 childId 设置为下一个版本。每个问题版本只能是另一个问题版本的子版本。

完成 findLatestVersion 存储过程,使其返回最新的问题版本。

示例案例:

CALL findLatestVersion(0);
-- Expected output (in any order): 
-- 3

我需要帮助来编写代码

【问题讨论】:

  • -- 示例:CALL findLatestVersion(0) -- 预期输出(以任何顺序): -- 3
  • 代码从 cmets 转移到问题中。

标签: mysql recursion common-table-expression


【解决方案1】:
CREATE PROCEDURE findLatestVersion (IN question_id INT)
WITH RECURSIVE
cte AS (
    SELECT id, childId, 1 level
    FROM questions 
    WHERE id = question_id 
    UNION ALL
    SELECT questions.id, questions.childId, cte.level + 1
    FROM cte
    JOIN questions ON cte.childId = questions.id
)
SELECT cte.id
FROM cte
ORDER BY level DESC LIMIT 1;

【讨论】:

  • 谢谢Akina,代码功能很好,但我怀疑为什么当输入question_id = 2时,程序给出的结果为2。感谢您提供的任何帮助。 :)
  • @MilagrosSantos为什么当输入 question_id =2 时,程序给出的结果为 2。??你想看到什么输出?
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2017-11-05
相关资源
最近更新 更多