【问题标题】:Extracting data from multiple tables in mysql从mysql中的多个表中提取数据
【发布时间】:2016-02-14 08:47:21
【问题描述】:

我的问题是编写一个 SQL 查询来返回所有教过至少 2 名学生在课程中获得B- 或更好的课程的教师的姓名。

我的桌子是:

Courses(id, name, teacher_id)
Grades(student_id, course_id, grade)
Students(id, name, email, password)
Teachers(id, name)

我使用了以下查询:

SELECT * FROM grades JOIN teachers WHERE grades.grade = 'B-'

但显示所有老师都喜欢

【问题讨论】:

  • 使用数值表示成绩可能比使用 varchars 更容易。 85-89b-b 更容易以编程方式解释。
  • 我认为它应该被存储为varchars。 85-89应该在客户端计算,而不是存储在数据库中,结果等级是目的

标签: php mysql


【解决方案1】:

你可以使用exists()来检查每个老师是否存在一个超过2个'b-'或更好的课程

所以你的查询应该是:

SELECT * FROM Teachers t
WHERE EXISTS(SELECT c.teacher_id from Courses c
             inner join grades g ON c.id= g.course_id
             where t.id = c.teacher_id and g.grade in('B-','B','A-','A','A+')
             group by c.teacher_id having count(*) > 1)

【讨论】:

    【解决方案2】:

    这应该可行:

    Select distinct Teachers.name from Courses join Teachers on Courses.teacher_id = Teachers.id where Courses.id in (Select course_id from (Select course_id, count(student_id) as 'total' from Grades where grade = 'B-' or grade = 'B' or grade = 'B+' or grade = 'A-' or grade = 'A' group by course_id) a where a.total > 1)
    

    【讨论】:

    • 这两个查询不一定,你可以让 count(*) >1 而不是用另一个查询包装它并使用 where 子句,此外,如果老师教了两门以上的课程那两个学生多了,他会被退回两次或更多。最后,使用 IN(v1,v2,v3) 而不是 OR,这会减慢进程。
    • 是的,我在发布后几乎立即对其进行了编辑;我意识到我只有B-。现在它将包括“或更好”。
    • @sagi 好点。我没有考虑过重复的老师。我会编辑。我相信你在 where 子句中有 count(*) > 1 ,但我从来没有测试过,所以我会留下那一点,因为我知道它会起作用。
    • Having 子句就像 group by 的 where 子句,所以当你使用 group by 时,如果你想在其中一个聚合值上有 where,你需要在 group by 之后使用 having 子句.例如。看看我的解决方案
    猜你喜欢
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多