如何计算mysql中嵌套表架构的百分比
我当前的表体系结构如下所示:如何计算mysql中嵌套表架构的百分比,mysql,sql,Mysql,Sql,我当前的表体系结构如下所示: 卡片表(父表:卡片) 每张卡有一个或多个列表(第二个子列表) 每个列表都有许多任务(第三个子任务 每当用户填写一个任务时,它将被填写在一个单独的表中,该表名为(user\u tasks) 如果你想想象它就像一棵树 卡片=>多张卡片列表=>多张列表任务 卡片 ID |名称 列表 身份证|卡|身份证|姓名 任务 ID |列出| ID |卡| ID |标题 用户任务 Id |任务|用户| Id |内容 现在我需要写一个查询或者一个简单的逻辑,不管它是什么,我都无法计算出每
卡片
)列表
)user\u tasks
){
card_id: 1,
total_lists: 10
total_filled: 3
}
接着,在数据库中的所有卡片上…您可以使用以下查询
SELECT target.cardid as 'card_id', target.total as 'total_lists', IFNULL(progress.total,0) as 'total_filled'
FROM (SELECT l.cardid, Count(l.id) total
FROM lists l
GROUP BY l.cardid) target
LEFT JOIN (SELECT l.cardid, userlist.userid, Count(userlist.listid) total
FROM lists l
INNER JOIN (SELECT ut.userid, t1.listid, Count(ut.taskid) tcount
FROM user_tasks ut
INNER JOIN tasks t1 ON t1.id = ut.taskid
GROUP BY ut.userid, t1.listid) userlist --- STEP#1
ON l.id = userlist.listid
INNER JOIN (SELECT t.listid, Count(*) tcount
FROM tasks t
GROUP BY t.listid) tasklist --- STEP#2
ON userlist.listid = tasklist.listid AND userlist.tcount = tasklist.tcount --- STEP#3
GROUP BY l.cardid, userlist.userid) progress -- STEP#4
ON target.cardid = progress.cardid;
说明:
:确定每个用户id和列表id的任务数步骤1
:确定所有列表中每个列表id的任务计数步骤2
:筛选步骤3
中没有列表中所有任务条目的记录用户任务
:获取包含所有任务条目的步骤4
用户任务中的列表计数
- 最后,加入
和目标
子查询以获取最终结果进度
注:两项观察结果
tasks
不应该有cardid
,只有listid
必须存在userid
。参考-这相当简单。要查找包含任务的所有列表并检查其所有任务是否已完成,请执行以下操作:
select lists.id,
count(tasks.id)=count(user_tasks.id) filled
from lists
join tasks on tasks.lists_id=lists.id
left join user_tasks on user_tasks.task_id=tasks.id
group by lists.id
要报告每张卡的总列表和已填写列表的数量,您可以将其用作子查询(添加card_id以便能够按卡查找列表):
如果一个任务可以由多个用户完成,请将
count(user\u tasks.id)
更改为count(distinct user\u tasks.tasks\u id)
请以表格文本形式提供示例数据和所需结果。如何提供它们?你需要这个模式吗@GMB每个表中只有几个代表性的行,以及相应的结果-全部为表格文本(因此有很好的选项格式表)。@GMB好的,我做了一些编辑。这看起来比需要的复杂吗?我想只需要一个subquery@ysth,尽我所能简化它。甚至不能用mysql 8的功能来实现。如果你能使用这个链接,并发布一个简单的答案,那就太好了?要求是用户任务中列表的百分比与卡和用户的总列表的百分比。用户任务中的列表只有在列表中包含所有任务的条目时才需要计数。@ysth真棒!!!你能把这个答案贴出来吗?我应该帮你们,谢谢你们。但是我没有明白你的问题,你说两个不同的用户可以在同一张卡上工作是什么意思?它已经包含在用户任务中。您是否建议为更简单的查询提供更好的体系结构?非常感谢,这非常有帮助,我非常感谢您的帮助
select card.id,
count(card_lists.id) as total_lists,
sum(card_lists.filled) as total_filled
from card
join (
select lists.id, lists.card_id,
count(tasks.id)=count(user_tasks.id) filled
from lists
join tasks on tasks.lists_id=lists.id
left join user_tasks on user_tasks.task_id=tasks.id
group by lists.id, lists.card_id
) card_lists on card_lists.card_id=card.id
group by card.id