本文主要是介绍【MySQL】with recursive 递归查询之寻找没有被执行的任务对,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
力扣题
1、题目地址
1767. 寻找没有被执行的任务对
2、模拟表
表:Tasks
Column Name | Type |
---|---|
task_id | int |
subtasks_count | int |
- task_id 具有唯一值的列。
- task_id 表示的为主任务的id,每一个task_id被分为了多个子任务(subtasks),
- subtasks_count表示为子任务的个数(n),它的值表示了子任务的索引从 1 到 n 。
- 本表保证2 <=subtasks_count<= 20。
表:Executed
Column Name | Type |
---|---|
task_id | int |
subtask_id | int |
- (task_id, subtask_id) 是该表中具有唯一值的列的组合。
- 每一行表示标记为task_id的主任务与标记为subtask_id的子任务被成功执行。
- 本表 保证 ,对于每一个task_id,subtask_id <= subtasks_count。
3、要求
编写解决方案报告没有被执行的(主任务,子任务)对,即没有被执行的(task_id, subtask_id)。
以 任何顺序 返回即可。
4、示例
输入:
Tasks 表:
task_id | subtasks_count |
---|---|
1 | 3 |
2 | 2 |
3 | 4 |
Executed 表:
task_id | subtask_id |
---|---|
1 | 2 |
3 | 1 |
3 | 2 |
3 | 3 |
3 | 4 |
输出:
task_id | subtask_id |
---|---|
1 | 1 |
1 | 3 |
2 | 1 |
2 | 2 |
解释:
Task 1 被分成了 3 subtasks (1, 2, 3)。只有 subtask 2 被成功执行, 所以我们返回 (1, 1) 和 (1, 3) 这两个主任务子任务对。
Task 2 被分成了 2 subtasks (1, 2)。没有一个subtask被成功执行, 因此我们返回(2, 1)和(2, 2)。
Task 3 被分成了 4 subtasks (1, 2, 3, 4)。所有的subtask都被成功执行,因此对于Task 3,我们不返回任何值。
5、代码编写
我的代码
WITH recursive m AS (SELECT task_id, subtasks_count AS subtask_id FROM TasksUNION ALLSELECT task_id, subtask_id-1 FROM m WHERE subtask_id > 1
)
SELECT a.*
FROM m a
LEFT JOIN Executed b USING(task_id, subtask_id)
WHERE b.subtask_id IS NULL
ORDER BY 1, 2
可参考
【MySQL】MySQL版本8+ 的 with recursive 两种递归语法的使用
【MySQL】MySQL版本8+ 的 with recursive 递归语法初次使用
这篇关于【MySQL】with recursive 递归查询之寻找没有被执行的任务对的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!