Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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
将3个mysql查询组合成一个查询_Mysql_Sql_Database_Database Design - Fatal编程技术网

将3个mysql查询组合成一个查询

将3个mysql查询组合成一个查询,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我有一个学校管理系统,存储学生成绩并生成学生报告 一个学生要通过考试,他必须具备 平均60%或以上 英语成绩达到60%或以上 在包括英语在内的5门学科中获得至少60%的成绩 我有查询来计算最好的5个科目,并得出一个平均值 但是我需要我的查询能够检查通过科目的值,并且计算学生通过的科目数(包括英语),并在一个查询中显示该信息 SELECT student_id, round((SUM(t.mark))/5) average_mark from ( select marks.

我有一个学校管理系统,存储学生成绩并生成学生报告

一个学生要通过考试,他必须具备

  • 平均60%或以上
  • 英语成绩达到60%或以上
  • 在包括英语在内的5门学科中获得至少60%的成绩
  • 我有查询来计算最好的5个科目,并得出一个平均值

    但是我需要我的查询能够检查通过科目的值,并且计算学生通过的科目数(包括英语),并在一个查询中显示该信息

    SELECT student_id, round((SUM(t.mark))/5) average_mark from (
                select marks.student_id,  ROUND(AVG(mark)) as mark  from marks
                    INNER JOIN teaching_loads ON teaching_loads.id=marks.teaching_load_id
                    INNER JOIN subjects ON subjects.id=teaching_loads.subject_id
                where marks.student_id = "520" AND marks.assessement_id=1  
                GROUP BY subject_id
                order by (subject_id =2) desc, mark desc
                
                LIMIT 5
                
                )t ORDER BY round((SUM(t.mark))/5) DESC
    
    
    如何构建一个查询来检查通过科目的值,并计算学生通过的科目数(包括英语),并在一个查询中显示该信息

    差不多

    学号:89 及格科目:6 及格科目分数:60分

    在一个查询中,我希望能够获得所有这些数据,我该如何进行, 请帮帮我

    下面是存储学生数据/分数及其相关表的数据库模式

    分数表存储学生分数

    CREATE TABLE `marks` (
      `id` bigint(20) UNSIGNED NOT NULL,
      `teacher_id` bigint(20) UNSIGNED NOT NULL,
      `student_id` bigint(20) UNSIGNED NOT NULL,
      `teaching_load_id` bigint(20) UNSIGNED NOT NULL,
      `assessement_id` bigint(20) UNSIGNED NOT NULL,
      `mark` int(11) NOT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
    
    CREATE TABLE `teaching_loads` (
      `id` bigint(20) UNSIGNED NOT NULL,
      `teacher_id` bigint(20) UNSIGNED NOT NULL,
      `subject_id` bigint(20) UNSIGNED NOT NULL,
      `class_id` bigint(20) UNSIGNED NOT NULL,
      `session_id` bigint(20) UNSIGNED NOT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
    
    教学负荷

    CREATE TABLE `marks` (
      `id` bigint(20) UNSIGNED NOT NULL,
      `teacher_id` bigint(20) UNSIGNED NOT NULL,
      `student_id` bigint(20) UNSIGNED NOT NULL,
      `teaching_load_id` bigint(20) UNSIGNED NOT NULL,
      `assessement_id` bigint(20) UNSIGNED NOT NULL,
      `mark` int(11) NOT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
    
    CREATE TABLE `teaching_loads` (
      `id` bigint(20) UNSIGNED NOT NULL,
      `teacher_id` bigint(20) UNSIGNED NOT NULL,
      `subject_id` bigint(20) UNSIGNED NOT NULL,
      `class_id` bigint(20) UNSIGNED NOT NULL,
      `session_id` bigint(20) UNSIGNED NOT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
    
    主题表

    CREATE TABLE `subjects` (
      `id` bigint(20) UNSIGNED NOT NULL,
      `subject_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `subject_type` enum('core','elective','non-value','passing_subject') COLLATE utf8mb4_unicode_ci NOT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    

    由于最后一个条件,这相当棘手。因此,我认为窗口功能:

    select student_id,
           (case when avg(mark) >= 0.6 then 'Pass'
                 when avg(case when subject = 'English' then mark end) > 0.6 then 'Pass'
                 when avg(case when seqnum = 5 then mark end) >= 0.6 then 'Pass'
                 else 'Fail'
             end) as pass_fail
    from (select m.*, subject,
                 row_number() over (partition by student_id order by (subject = 'English') desc, mark desc) as seqnum
          from marks m join
               teaching_loads tl
               on tl.id = m.teaching_load_id join
               subjects s
               on s.id = tl.subject_id
         ) ms
    group by student_id;
    
    这行吗

        select student_id,
           (case when avg(mark) >= 0.6 then 'Pass'
             when avg(case when subject = 'English' then mark end) > 0.6 then 'Pass'
             when avg(case when seqnum = 5 then mark end) >= 0.6 then 'Pass'
             else 'Fail'
         end) as pass_fail
           from (select m.*, subject,
             row_number() over (partition by student_id order by (subject = 'English') 
             desc, mark desc) as seqnum
              from marks m join
               teaching_loads tl
                 on tl.id = m.teaching_load_id join
                    subjects s
                      on s.id = tl.subject_id 
                       join
                        average_mark a
                        on a.student_id = marks.student_id
                        where a.average_mark > 60
                ) ms
       group by student_id;
    

    我非常感谢你的帮助。我刚刚运行了这个查询,它确实有效,唯一的例外是它显示所有学生都通过了pass\u fail列,即使是那些不符合条件的学生。而且,查询的列仅限于student\u id和pass\u fail列。在这个用例中,我们还需要显示通过科目的分数和学生通过的科目数。