sql根据ANDing多个详细记录选择主记录

时间:2016-10-19 12:50:17

标签: mysql sql

我有如下所述的主表和详细表(带有代表性数据)。我想为那些在生物学和化学方面都有“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,但这并没有让我得到我需要的地方。

非常感谢。

2 个答案:

答案 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 byhaving方法,因为它更灵活。