如何在MySQL中编写作为单个查询的多查询解决方案
我的任务是通过id查找数据库中(至少有一个,但)最低及格分数(分数为6级)的所有科目。我已经设法用三个查询编写了解决方案,但是我的任务是在MySQL中将其作为一个查询编写。先谢谢你如何在MySQL中编写作为单个查询的多查询解决方案,mysql,sql,Mysql,Sql,我的任务是通过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
-- 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 |
这应该能奏效。子查询选择第一个最低的6个数。主查询选择具有该编号的所有主题。技巧在于
按计数排序(*)限制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
)
这应该能奏效。子查询选择第一个最低的6个数。主查询选择具有该编号的所有主题。技巧在于
按计数排序(*)限制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
)
这种模式应该可以奏效。广义名称
SELECT subjectID
FROM TEST_DATA
WHERE grade = 6
GROUP
BY SubjectID
HAVING COUNT(1) =
( SELECT count(1) AS minCount
FROM TEST_DATA
WHERE grade = 6
GROUP
BY subjectID
ORDER
BY minCount
LIMIT 1
);
这种模式应该可以奏效。广义名称
SELECT subjectID
FROM TEST_DATA
WHERE grade = 6
GROUP
BY SubjectID
HAVING COUNT(1) =
( SELECT count(1) AS minCount
FROM TEST_DATA
WHERE grade = 6
GROUP
BY subjectID
ORDER
BY minCount
LIMIT 1
);
这不是一个解决办法。我得到一个错误,说“六个表”不存在。如果你编辑你的问题以包括数据表和预期输出的示例,你更有可能得到帮助。你是否考虑过将所有这些放在一个具有多个输出的函数中?如果有意义的话,你也可以创建一个存储过程。@Nemanjabberic只是提醒一下,因为这看起来像是家庭作业,下面的两个解决方案都使用了一种带有限制函数的SQL“技巧”。这可能未在课程材料中涵盖,可能有点显眼。纯普通的SQL方法需要在子查询中获得6的计数,然后在该子查询之外的另一个子查询中获得该结果集的最小值,最后执行HAVING count(1)=(这些子查询的最小计数)这不是一个解决方案。我得到一个错误,说“六个表”不存在。如果你编辑你的问题以包括数据表和预期输出的示例,你更有可能得到帮助。你是否考虑过将所有这些放在一个具有多个输出的函数中?如果有意义的话,你也可以创建一个存储过程。@Nemanjabberic只是提醒一下,因为这看起来像是家庭作业,下面的两个解决方案都使用了一种带有限制函数的SQL“技巧”。这可能未在课程材料中涵盖,可能有点显眼。纯普通SQL方法需要在子查询中获得6的计数,然后在该子查询之外的另一个子查询中获得该结果集的最小值,最后执行HAVING count(1)=(来自这些子查询的最小计数)操作。。。与第一句话平行思考是的,还有解决方案:德曼。。。与第一句话平行思考是的,还有解决方案:D