【问题标题】:sql select master records based on ANDing multiple detail recordssql根据ANDing多个详细记录选择主记录
【发布时间】:2016-10-19 12:50:16
【问题描述】:

我有如下所述的主表和详细表(带有代表性数据)。我想为生物学和化学均获得“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(ken 和 beth)。我已经尝试了一些使用连接和内部选择的变体,但不能完全让它工作。我的主要问题似乎是我正在对我的详细记录进行与运算,例如,...where grades.class='Biology' and grades.grade='A'

我查看了SQL select from header table where detail table rows have multiple values,但这并没有完全让我到达我需要的地方。

非常感谢您的帮助。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    试试这个

    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
    

    【讨论】:

      【解决方案2】:

      这是一种方法:

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

      【讨论】:

      • 有趣 - 从未想过将一个表加入到自身中(我以后必须记住这一点)。由于我的最终目标是与班级有可互换的成绩,这似乎更适合我的情况。鉴于 mysql 允许在单个语句中加入 61 个连接,这对我来说应该没问题。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多