将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.
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列。在这个用例中,我们还需要显示通过科目的分数和学生通过的科目数。