2015-10-06 62 views
1

我有一个包含3列的表称为记录所有科目:学生,科目和年级如何选择所采取的所有学生,使得学生在他们拿了级> 50

每个{X,Y,Z }表中的条目意味着学生x将y分为z等级。如果学生x没有参加课程y,那么表格中就不存在该参赛作品。所以这个表格就像所有学生的大学记录以及他们所学的科目。

我要选择那些采取所有学生所有科目,所有学生在这些科目的成绩都高于60

我试图创建

CREATE TABLE temp SELECT subject FROM records WHERE grade > 60; 

然后我用临时表创建一个具有主题和数量的新表,其中count统计接受该主题的学生数,然后删除所有具有<学生数的行。但我知道这是非常低效的。

我怎样才能做到这一点更有效地使用MySQL?
此外,如果你能给我提供良好的MySQL资源/教程链接,这样我可以练习,我将感谢。我是MySQL的新手,我正在处理大型数据库,我需要让我的查询更高效和直接。

回答

0

如何

SELECT subject FROM records 
WHERE subject NOT IN 
(
SELECT subject FROM records 
WHERE grade <=60 
) 
AND subject IN 
(
SELECT subject FROM records 
GROUP BY subject 
HAVING count(*) = (SELECT COUNT(DISTINCT student) FROM records) 
) 

随着进一步的阅读,我建议thisthis

编辑:现在包括“被所有学生进行了主题”

+0

编辑 - 添加了更多的阅读建议。 –

+0

感谢您的建议,用这种方法的一个问题是,如果主题不采取每个人,但由少数学生采取与这一小群学生拿到> = 60,然后这一主题将在此查询显示出来,但我不希望那。 –

+0

我明白。定义“小组”,我会更新。或者你想让这个主题被所有学生拍摄? –

0

我会用不存在的,因为条款它只是确认子查询中是否没有记录,但不会尝试获取结果集。它比不在条款中更有效。

SELECT subject FROM records r1 
WHERE subject NOT EXISTS 
(
SELECT 1 FROM records r2 
WHERE r2.subject=r1.SUBJECT AND grade<=60 
) 
相关问题