跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教一个 SQL 问题
未分類
11 9 月 2020

请教一个 SQL 问题

请教一个 SQL 问题

資深大佬 : sockball07 4

现有 2 张表

course     course_id  int   课程 ID     score      float 课程得分,满分 100,60 及格     student_id int   学生 ID  student     student_id int   学生 ID     name       int   学生姓名 

一个学生可能有多个课程得分(即 student 一对多于 course )

现定义一个学生及格的条件为所有课程中只要有一门课程及格则算及格,只有所有课程不及格的情况下才算不及格

求所有及格的学生和所有不及格的学生。

及格很简单

SELECT     s.student_id,     s.name FROM     student s INNER JOIN     course c ON     s.student_id = c.student_id WHERE     c.score >= 60 GROUP BY     student_id 

但是不及格却不能直接以 WHERE c.score < 60 GROUP BY student_id 得出结果

问除了使用 ( NOT IN 及格的学生)的结果 还有什么比较好的方法?

此处只是模拟真实场景,实际上的条件比score >= 60要多,所以不应该特别针对此处使用MIN来做…(如果回复有我会再说明的)

大佬有話說 (5)

  • 資深大佬 : wisunny

    exists

  • 資深大佬 : TimePPT

    想了下,试试用 case when then else 把及格不及格二值化(及格赋值 1,不及格 0 ),然后 group by 求和,和大于 0 的及格,等于 0 的不及格

  • 資深大佬 : chotow

    SELECT s.name, c.score, c.course_id
    FROM course AS c
    JOIN student AS s ON s.student_id = c.student_id
    LEFT JOIN course AS c_tmp ON c_tmp.student_id = c.student_id AND c.score < c_tmp.score
    WHERE c_tmp.course_id IS NULL
    AND c.score < 60

    https://dev.mysql.com/doc/refman/8.0/en/example-maximum-column-group-row.html

  • 資深大佬 : wspsxing

    select student_id, name, pass, cc from (select student_id, sum(score >= 60) as pass, count(score) as cc from course group by student_id)a join student as s on a.student_id = s.id where pass <= 0

  • 資深大佬 : awen233333

    having max(c.score)<60

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具