一、力扣链接
LeetCode_1767
二、题目描述
表: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。
编写解决方案报告没有被执行的(主任务,子任务)对,即没有被执行的(task_id, subtask_id)。
以 任何顺序 返回即可。
三、目标拆解
四、建表语句
Create table If Not Exists Tasks (task_id int, subtasks_count int)
Create table If Not Exists Executed (task_id int, subtask_id int)
Truncate table Tasks
insert into Tasks (task_id, subtasks_count) values ('1', '3')
insert into Tasks (task_id, subtasks_count) values ('2', '2')
insert into Tasks (task_id, subtasks_count) values ('3', '4')
Truncate table Executed
insert into Executed (task_id, subtask_id) values ('1', '2')
insert into Executed (task_id, subtask_id) values ('3', '1')
insert into Executed (task_id, subtask_id) values ('3', '2')
insert into Executed (task_id, subtask_id) values ('3', '3')
insert into Executed (task_id, subtask_id) values ('3', '4')
五、过程分析
1、找出所有的任务对
2、连接Executed表找出没有没有被执行的任务对
六、代码实现
with recursive t1(task_id, subtask_id) as (
select task_id, 1
from tasks
union all
select t1.task_id, subtask_id + 1
from t1 left join tasks t on t.task_id = t1.task_id
where t1.subtask_id + 1 <= t.subtasks_count -- 这里t1.subtask_id + 1是要限制递归新值最大不能超过子任务的个数
)
select t1.task_id, t1.subtask_id
from t1
left join Executed e on e.task_id = t1.task_id and e.subtask_id = t1.subtask_id
where e.task_id is null;
七、结果验证
八、小结
1、思路是递归 + 左连接
2、从一个值得出多个值,考虑使用递归
3、MySQL的递归是recursive + CTE表达式 + union all/union + select语句,注意递归的结束条件