Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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从另一个表(B)中填充一个表(A)上缺少的行?_Mysql_Sql - Fatal编程技术网

如何用MySQL从另一个表(B)中填充一个表(A)上缺少的行?

如何用MySQL从另一个表(B)中填充一个表(A)上缺少的行?,mysql,sql,Mysql,Sql,我正在用PHP和MySQL建立一个虚拟教室。该教室包括课程,每门课程包含不同的科目或模块。学生必须检查每个模块,最后制作总结(评估板),以了解学生是否通过了课程 话虽如此,我有一个表格,其中存储了每个学生的评估,其中我保存了inscripcion_id(学生-题词id)、modulo_id(模块id)、fecha(考试日期)、aciertos(正确答案的数量)、ultima_Concatoria(评估最后一次会议)和estado(状态) SQL小提琴-> 通过一些先前建立的规则,告诉我学生是否通

我正在用PHP和MySQL建立一个虚拟教室。该教室包括课程,每门课程包含不同的科目或模块。学生必须检查每个模块,最后制作总结(评估板),以了解学生是否通过了课程

话虽如此,我有一个表格,其中存储了每个学生的评估,其中我保存了inscripcion_id(学生-题词id)、modulo_id(模块id)、fecha(考试日期)、aciertos(正确答案的数量)、ultima_Concatoria(评估最后一次会议)和estado(状态)

SQL小提琴->

通过一些先前建立的规则,告诉我学生是否通过了模块,我得到了以下数据集:

+----------------+-----------+---------------------+----------+---------------------+--------+------------+
| inscripcion_id | modulo_id |        fecha        | aciertos | ultima_convocatoria | estado |     ev     |
+----------------+-----------+---------------------+----------+---------------------+--------+------------+
|            890 |         1 | 2018-01-24 22:26:09 |        8 |                   2 |      1 | aprobado   |
|            890 |         2 | 2018-01-24 22:36:58 |        3 |                   3 |      0 | suspendido |
|            890 |         5 | 2018-01-24 22:38:50 |        3 |                   1 |      0 | suspendido |
|            890 |         6 | 2018-01-24 22:44:20 |        7 |                   3 |      0 | suspendido |
|            891 |         1 | 2018-01-25 09:24:42 |        8 |                   1 |      1 | aprobado   |
|            891 |         2 | 2018-01-25 10:01:55 |        4 |                   8 |      0 | suspendido |
|            891 |         4 | 2018-01-25 10:51:49 |        5 |                   3 |      1 | suspendido |
|            891 |         5 | 2018-01-25 10:23:45 |        9 |                   1 |      1 | aprobado   |
|            891 |         6 | 2018-01-25 11:21:20 |        7 |                   3 |      0 | suspendido |
|            896 |         1 | 2018-01-25 11:55:48 |        1 |                   1 |      1 | suspendido |
|            898 |         1 | 2018-01-25 14:01:51 |        6 |                   1 |      1 | suspendido |
|            907 |         1 | 2018-03-25 16:06:18 |        3 |                   1 |      0 | suspendido |
|            907 |         2 | 2018-03-25 16:07:34 |        3 |                   1 |      0 | suspendido |
|            907 |         3 | 2018-03-25 16:09:04 |        3 |                   1 |      0 | suspendido |
|            907 |         4 | 2018-03-25 16:08:13 |        3 |                   1 |      0 | suspendido |
|            907 |         5 | 2018-03-25 16:10:37 |        2 |                   1 |      0 | suspendido |
|            907 |         6 | 2018-03-25 16:08:44 |        3 |                   1 |      0 | suspendido |
+----------------+-----------+---------------------+----------+---------------------+--------+------------+
此数据通过以下查询获得:

SELECT  e1.inscripcion_id,
        e1.modulo_id,
        e1.fecha,
        e1.aciertos,
        e1.convocatoria AS ultima_convocatoria,
        e1.estado,
        if  (
                ( e1.modulo_id in (SELECT modulo.modulo_id FROM modulo WHERE modulo.curso_id = 1 AND modulo.categoria_id = 1)
                    AND e1.aciertos <= 7 )
                OR ( e1.modulo_id = (SELECT modulo.modulo_id FROM modulo WHERE modulo.curso_id = 1 AND modulo.categoria_id = 2)
                    AND e1.aciertos <= 11 ),
                "suspendido",
                "aprobado"
        ) AS ev
FROM    (
            SELECT  inscripcion_id,
                    modulo_id,
                    MAX(convocatoria) AS max_convocatoria
            FROM `evaluacion`
            GROUP BY    inscripcion_id,
                        modulo_id
            ORDER BY    `inscripcion_id` ASC,
                        `modulo_id` ASC,
                        `convocatoria` ASC
) AS e2
INNER JOIN evaluacion AS e1
    ON e1.inscripcion_id = e2.inscripcion_id
    AND e1.modulo_id = e2.modulo_id
    AND e1.convocatoria = e2.max_convocatoria
结果是学生尚未完成的模块被添加,新值“待定”用于ev

我不知道怎么做。。。我试过了,我在网上搜索过,什么都没有:(

最终目标是什么?我想要的是获得一份最终名单,列出所有拥有待定课程的学生(也就是说,他们拥有一些待定模块),向他们发送提醒电子邮件,提醒他们必须检查剩余模块。对于已批准或暂停的用户,不会向他们发送电子邮件

你能帮我吗

SQL小提琴->

非常感谢您审阅完新的 我写了下面的查询,我想它应该涵盖你想要的

请注意,每个模块有多个评估,这意味着每个模块将获得多个状态

要解决这个问题,您可以添加一个group语句(在CommentNow中) 或者你可以根据自己的需要进行不同的评估

SELECT
  i.inscripcion_id,
  c.curso_id,
  c.titulo AS curso_titulo,
  m.modulo_id,
  m.titulo AS modulo_titulo,
  IFNULL(ev.estado,0) AS estado,
  m.*
 FROM
   inscripcion i
   INNER JOIN curso c ON c.curso_id = i.curso_id
   INNER JOIN modulo m ON m.curso_id = c.curso_id
   LEFT JOIN evaluacion ev ON ev.modulo_id = m.modulo_id
 WHERE
   (ev.estado = 0 OR ev.estado IS NULL)
/*
GROUP BY
 m.modulo_id
*/

假设您想让评估表中没有模块的学生像您在示例中提供的那样处于“待定”状态。让学生加入所有模块的方法是在
modulo
evaluationon
上进行完全联接,以获得一整套不同的
inscripcion\u id
modulo\u id
现有查询将提供所需的结果


获取每个学生的状态计数,然后使用这些计数进行逻辑运算。

是的,确实,我遗漏了一些表格。我认为这个例子与此无关。我尝试复制您的答案,但未能做到:(无论如何,谢谢您的时间!您可以将它们添加到任务描述和SQLFIDLE中,更容易回答我只看到两个表modulo和evaluacion…我缺少什么吗?是否有新的SQLFIDLE链接?抱歉,我不知道为什么更改没有保存在其他链接中:(新链接-->再次感谢您的时间,但遗憾的是,这不是我想要的结果:(没关系,@samabcde得到了结果它的效果很好!谢谢!!!我能再问一个提示吗?一旦我通过你的查询得到了结果,我该如何按照“inscripcion_id”对结果进行分组,考虑到我想分析“ev”字段,如果有5个或更多的已批准模块,那么课程就被批准了,如果6个模块中的任何一个未完成最后,如果有2个或更多模块被挂起,则最终等级将被挂起…因此,一旦应用GROUP BY,“ev”字段将根据之前的条件具有值…5个模块已批准,1个模块待决?2个模块已挂起,4个模块待决?您是否同意规则具有优先级?规则是:如果挂起模块-->最终等级=挂起//如果5个或更多模块被禁用-->最终等级=被禁用//如果2个或更多模块被挂起-->最终等级=挂起。///根据这些规则,我可以回答您的问题如下:5个模块被批准,1个挂起-->最终等级=挂起//2个模块被挂起ed和4 pending-->final grade=pending.///首要任务是检查是否有模块挂起,那么final grade将挂起…再次感谢!!我刚刚看到了进一步的答案。再次感谢!我刚刚尝试过,效果很好。现在我将试着继续。谢谢@samabcde!
SELECT
  i.inscripcion_id,
  c.curso_id,
  c.titulo AS curso_titulo,
  m.modulo_id,
  m.titulo AS modulo_titulo,
  IFNULL(ev.estado,0) AS estado,
  m.*
 FROM
   inscripcion i
   INNER JOIN curso c ON c.curso_id = i.curso_id
   INNER JOIN modulo m ON m.curso_id = c.curso_id
   LEFT JOIN evaluacion ev ON ev.modulo_id = m.modulo_id
 WHERE
   (ev.estado = 0 OR ev.estado IS NULL)
/*
GROUP BY
 m.modulo_id
*/
SELECT fs.inscripcion_id, 
       fs.modulo_id, 
       e3.fecha, 
       e3.aciertos, 
       e3.ultima_convocatoria, 
       e3.estado, 
       IF(e3.ev IS NULL, "pendiente", e3.ev) AS ev 
FROM   (SELECT m.modulo_id, 
               e.inscripcion_id 
        FROM   modulo m, 
               evaluacion e 
        GROUP  BY m.modulo_id, 
                  e.inscripcion_id) AS fs 
       LEFT JOIN (SELECT 
                                          e1.inscripcion_id, 
                         e1.modulo_id, 
                         e1.fecha, 
                         e1.aciertos, 
                         e1.convocatoria 
                                                            AS 
                                          ultima_convocatoria 
                                          , 
                         e1.estado, 
                         IF (( e1.modulo_id IN (SELECT modulo.modulo_id 
                                                FROM   modulo 
                                                WHERE  modulo.curso_id = 1 
                                                       AND modulo.categoria_id = 
                                                           1) 
                               AND e1.aciertos <= 7 ) 
                              OR ( e1.modulo_id = (SELECT modulo.modulo_id 
                                                   FROM   modulo 
                                                   WHERE 
                                   modulo.curso_id = 1 
                                   AND modulo.categoria_id = 2) 
                                   AND e1.aciertos <= 11 ), "suspendido", 
                         "aprobado") 
                                          AS ev 
                  FROM   (SELECT inscripcion_id, 
                                 modulo_id, 
                                 Max(convocatoria) AS max_convocatoria 
                          FROM   `evaluacion` 
                          GROUP  BY inscripcion_id, 
                                    modulo_id 
                          ORDER  BY `inscripcion_id` ASC, 
                                    `modulo_id` ASC, 
                                    `convocatoria` ASC) AS e2 
                         INNER JOIN evaluacion AS e1 
                                 ON e1.inscripcion_id = e2.inscripcion_id 
                                    AND e1.modulo_id = e2.modulo_id 
                                    AND e1.convocatoria = e2.max_convocatoria) 
                 AS e3 
              ON fs.modulo_id = e3.modulo_id 
                 AND fs.inscripcion_id = e3.inscripcion_id 
ORDER  BY fs.inscripcion_id, 
          fs.modulo_id; 
SELECT inscripcion_id,
    SUM(case when ev = 'aprobado' then 1 else 0 end) as approved_cnt,
    SUM(case when ev = 'suspendido' then 1 else 0 end) as suspended_cnt,
    SUM(case when ev = 'pendiente' then 1 else 0 end) as pending_cnt 
From --the above query...
Group by inscripcion_id