我有如下所述的主表和详细表(带有代表性数据)。我想为那些在生物学和化学方面都有“A”的学生选择(符合mysql)Student.id。
Students grades
id name id student_id class grade
1 ken 1 1 Biology A
2 beth 2 1 Chemistry A
3 joe 3 1 Math B
4 2 Biology A
5 2 Chemistry A
6 2 Math A
7 3 Biology B
8 3 Chemistry A
9 3 Math A
目前,我只是将所有数据都输入到我的程序(java)中,但想想在SQL中必须有一种方法才能获得正确的记录。
我从上面的数据中寻找的结果将是1& 2(肯和贝丝)。我已尝试使用连接和内部选择的一些变体,但不能完全让它工作。我的主要问题似乎是我正在修改我的详细记录,例如。...where grades.class='Biology' and grades.grade='A'
我看了SQL select from header table where detail table rows have multiple values,但这并没有让我得到我需要的地方。
非常感谢。
答案 0 :(得分:0)
试试这个
select s.id from students as s
inner join grades as g on s.id=g.student_id
group by s.id
having max(case when g.class='Biology' and g.grade='A' then 1 else 0 end)=1
and
having max(case when g.class='Chemistry' and g.grade='A' then 1 else 0 end)=1
答案 1 :(得分:0)
这是一种方式:
select g.student_id
from grades g
where g.class in ('Biology', 'Chemistry') and g.grade = 'A'
group by g.student_id
having count(distinct class) = 2;
注意:
join
不是必需的,因为grades
表具有学生ID。where
子句仅获取学生在任一课程中都有'A'
的记录。having
保证学生在两个班级都有'A'
。我应该注意,有一种替代方法使用join
但不使用group by
:
select gb.student_id
from grades gb join
grades gc
on gb.student_id = gc.student_id and
gb.class = 'Biology' and gc.class = 'Chemistry' and
gb.grade = 'A' and gc.grade = 'A';
这样做 - 性能甚至可能更好。我喜欢group by
和having
方法,因为它更灵活。