Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算mysql中嵌套表架构的百分比_Mysql_Sql - Fatal编程技术网

如何计算mysql中嵌套表架构的百分比

如何计算mysql中嵌套表架构的百分比,mysql,sql,Mysql,Sql,我当前的表体系结构如下所示: 卡片表(父表:卡片) 每张卡有一个或多个列表(第二个子列表) 每个列表都有许多任务(第三个子任务 每当用户填写一个任务时,它将被填写在一个单独的表中,该表名为(user\u tasks) 如果你想想象它就像一棵树 卡片=>多张卡片列表=>多张列表任务 卡片 ID |名称 列表 身份证|卡|身份证|姓名 任务 ID |列出| ID |卡| ID |标题 用户任务 Id |任务|用户| Id |内容 现在我需要写一个查询或者一个简单的逻辑,不管它是什么,我都无法计算出每

我当前的表体系结构如下所示:

  • 卡片表(父表:
    卡片
  • 每张卡有一个或多个列表(第二个子
    列表
  • 每个列表都有许多任务(第三个子任务
  • 每当用户填写一个任务时,它将被填写在一个单独的表中,该表名为(
    user\u tasks
  • 如果你想想象它就像一棵树 卡片=>多张卡片列表=>多张列表任务

    卡片 ID |名称

    列表 身份证|卡|身份证|姓名

    任务 ID |列出| ID |卡| ID |标题

    用户任务 Id |任务|用户| Id |内容

    现在我需要写一个查询或者一个简单的逻辑,不管它是什么,我都无法计算出每张卡的进度

    卡片进度通过用户填写完整列表的方式计算

    示例:

  • 卡1有3个列表,每个列表有4个任务
  • 用户填写了这些列表中的所有任务(4x3),卡片进度为3/3

  • 卡1有3个列表,每个列表有4个任务
  • 用户填写了任意2个列表(4x2)中的所有任务卡进度为2/3

  • 卡1有3个列表,每个列表有4个任务
  • 用户仅填写了列表1中包含4项任务的2项任务。卡片进度将为0/3

    因此,考虑一个完成的列表,用户必须填写所有的任务。 有没有人能指导我如何使用嵌套表体系结构的逻辑来让卡继续运行

    因此,我希望输出结果如下所示:

    {
       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; 
    
    说明:

    • 步骤1
      :确定每个用户id和列表id的任务数
    • 步骤2
      :确定所有列表中每个列表id的任务计数
    • 步骤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