mysql - 如何在 MySQL 中将多个查询解决方案编写为单个查询
问题描述
我的任务是通过他们的 id 找到所有那些在数据库中具有(至少一个,但是)最低及格分数最少的科目(等级是 6 年级)。我已经设法用三个查询编写了解决方案,但是我的任务是将其编写为 MySQL 中的单个查询。先感谢您。
-- 1. single query "solution"
SELECT subject_id FROM (SELECT subject_id, COUNT(*) AS six_count
FROM exams WHERE grade = 6
GROUP BY subject_id) AS sixes
WHERE subject_id = (SELECT MIN(six_count) FROM sixes);
-- 2. multiple queries solution
CREATE TABLE sixes AS (SELECT subject_id, COUNT(*) AS six_count
FROM exams WHERE grade = 6
GROUP BY subject_id);
SELECT subject_id FROM sixes
WHERE subject_id = (SELECT MIN(six_count) FROM sixes);
DROP TABLE sixes;
编辑: 考试表示例:
| subject_id | student_id | exam_year | exam_mark | grade | exam_date |
| 1 | 20100022| 2011 | 'apr' | 10 | 2011-04-11 |
| 2 | 20100055| 2011 | 'oct' | 6 | 2011-10-04 |
| 3 | 20110030| 2011 | 'jan1' | 7 | 2011-01-26 |
| 5 | 20110055| 2011 | 'jan2' | 6 | 2011-02-13 |
| 5 | 20110001| 2011 | 'jun1' | 8 | 2011-06-23 |
解决方案
这应该可以解决问题。子查询选择第一个最低的六位数。主查询选择具有该编号的所有主题。诀窍在于ORDER BY count(*) LIMIT 1
,它使子查询返回计数最低的记录。
SELECT
subject_id,
count(*) as six_count
FROM exams
WHERE grade = 6
GROUP BY subject_id
HAVING count(*) =
( SELECT count(*)
FROM exams
WHERE grade = 6
GROUP BY subject_id
ORDER BY count(*)
LIMIT 1
)
推荐阅读
- angular - ngDoCheck 的 Angular 替代品,用于检测服务中布尔值的变化?
- kotlin - Kotlin 将 int 转换为浮动
- asp.net-mvc - MVC - EF - 将我的个人资料与我的 Twitter 连接(未登录)
- identityserver4 - Identity Server 4 在注销时获得 Id_Token_Hint
- python - 在 Python 中使用 exec() 时如何传递套接字变量?
- javascript - 检查数组中的所有值是否为假
- xcode - Flutter App 安装后崩溃
- rust - Rust 抱怨在执行联合时没有为 HashSet 实现 BitOr,文档声明它应该是
- django - 在一个 VPS 上服务两个网站
- java - 如何将 Deeplearning4j 的 UIServer 端口从 9000 更改为其他端口?