【问题标题】:Combine 3 mysql queries to form one query将 3 个 mysql 查询组合成一个查询
【发布时间】:2021-04-16 17:30:49
【问题描述】:

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

一个学生要通过他,她必须有;

  1. 平均60%或以上
  2. 英语达到 60% 或以上
  3. 在包括英语在内的 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 通过_subject_mark:60

在一个查询中,我希望能够获取所有数据,我该怎么做? 请帮帮我。

以下是存储学生数据/分数的数据库及其相关表的架构。

Marks Table-Stores 学生成绩

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;

SQL Fiddle that has the database schema

【问题讨论】:

    标签: mysql sql database database-design


    【解决方案1】:

    由于最后一个条件,这相当棘手。所以,我在考虑窗口函数:

    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;
    

    【讨论】:

    • 非常感谢您的帮助。我刚刚运行了查询,它确实有效,唯一的例外是它显示所有学生都已通过 pass_fail 列,即使是那些不符合条件的学生。而且,查询的列仅限于 student_id 和 pass_fail 列。在这个用例中,我们还需要显示通过科目的分数和学生通过的科目数。
    【解决方案2】:

    这行得通吗?

        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;
    

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 2018-07-15
      相关资源
      最近更新 更多