【问题标题】:Recursive select in mysqlmysql中的递归选择
【发布时间】:2023-04-10 18:55:01
【问题描述】:

我有一个格式如下的表格

TaskID  ParentTaskID
1       1
2       1
3       2
4       2
5       2
10      10
11      11
12      11
13      0
14      14

如果taskid为1,我想要如下结果

TaskID
1
2
3
4
5

如果是 2 则

Taskid
2
3
4
5

如果是 10 则为 10

表示我想选择 taskid = 1 的行和 parenttaskid = 1 的行 在上面的选择中具有 parenttaskid 的行等等......

请使用这个小提琴http://sqlfiddle.com/#!2/9db0c3/6

【问题讨论】:

  • select t2.id,t2.parenttaskid from tbl_taskmaster t1 Inner join tbl_taskmaster t2 on t1.id=t2.parenttaskid where t1.parenttaskid=1
  • 用评论中的内容更新您的问题。
  • 您需要的答案是 sql 语句,还是存储过程可以满足您的需求?是否有关于可以找到的最大递归级别数的安全假设?
  • MySQL 不支持递归选择是一个简短的回答。但是您应该能够使用子查询获得所需的内容,请查看此帖子stackoverflow.com/questions/16513418/…
  • @RobP 我需要 sql 语句。没有任何最大限​​制

标签: mysql sql


【解决方案1】:

MySQL 不支持递归选择。

但是,下面的查询应该可以解决您正在寻找的问题

SELECT t.TaskID
FROM task AS t
INNER JOIN (
    SELECT DISTINCT a.TaskID 
    FROM task AS a
    INNER JOIN (
        SELECT TaskID 
        FROM task
        WHERE TaskID = 11 OR ParentTaskID = 11
        UNION ALL
        SELECT ParentTaskID
        FROM task
        WHERE TaskID = 11 OR ParentTaskID = 11
    ) AS s ON s.TaskID = a.ParentTaskID
) AS s ON s.TaskID = t.TaskID

【讨论】:

  • 我试过你的查询,但它没有得到确切的结果sqlfiddle.com/#!2/9db0c3/6
  • 我刚刚更新了答案。我认为您的问题存在逻辑问题。如果 taskid = 2 那么输出也应该是 1 2 3 4 5 task_id = 2 的父级是 1 所以应该包括 1 sqlfiddle.com/#!2/9db0c3/15
  • 如果 taskid=2,那么这意味着我想从上面的结果集中选择 taskid =2 的行以及 parenttaskid =2 的行以及如果任何子任务具有 parenttaskid。我希望你明白逻辑......
  • 实际上我的要求是删除与给定taskid相关的任务,以及将parenttaskid作为给定taskid的更多子任务。
  • 我建议您接受我的查询并尝试一下。 :)
【解决方案2】:

正如 Mike 已经说过的,MySQL 不支持递归选择或递归函数。

如果您对任务连接有最大逻辑限制(例如 5 个),您可以使用硬编码的自连接。

SELECT
t1.taskid as taskid1,
t2.taskid as taskid2,
t3.taskid as taskid3,
t4.taskid as taskid4,
t5.taskid as taskid5
FROM task t1
LEFT JOIN task t2 ON t2.parenttaskid = t1.taskid
LEFT JOIN task t3 ON t3.parenttaskid = t2.taskid
LEFT JOIN task t4 ON t4.parenttaskid = t3.taskid
LEFT JOIN task t5 ON t5.parenttaskid = t4.taskid

这将产生这个结果:http://sqlfiddle.com/#!2/c9f80/1/0

顺便说一句,您的输入数据中有一些自引用任务,这会产生一个无限循环的递归。

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多