Php 在mysql中从多个表中提取数据
我的问题是编写一个SQL查询来返回所有教授过课程的教师的姓名,其中至少有2名学生在该课程中获得了Php 在mysql中从多个表中提取数据,php,mysql,Php,Mysql,我的问题是编写一个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加入grades.grade='B-'的教师队伍。 但所有的老师都喜欢
B-
或更好的成绩
我的桌子是:
Courses(id, name, teacher_id)
Grades(student_id, course_id, grade)
Students(id, name, email, password)
Teachers(id, name)
我使用了以下查询:
SELECT*FROM grades加入grades.grade='B-'的教师队伍。
但所有的老师都喜欢
您可以使用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)
您可以使用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)
这应该起作用:
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)
这应该起作用:
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)
与varchars相比,使用数值表示品位可能更容易
85-89
比b-
或b
更容易以编程方式进行解释。我认为它应该以varchars的形式存储。85-89应在客户机上计算,但不应存储在数据库中,结果等级的目的是使用数值计算等级可能比使用VARCHAR更容易85-89
比b-
或b
更容易以编程方式进行解释。我认为它应该以varchars的形式存储。85-89应该在客户端计算,但不存储在数据库中,结果分数是目的。2个查询不一定是,你可以让count(*)大于1,而不是用另一个查询包装它,并使用where子句,更进一步,如果一名教师在两个以上的课程中授课,两名学生人数更多,他将被送回两次或两次以上。最后,用IN(v1,v2,v3)代替OR,这会减慢进程;我意识到我只有B-。现在它将包括“或更好”。@sagi的观点很好。我没想到会有复职教师。我会编辑。我相信您会在where子句中使用count(*)>1,但我从未测试过,因此我将保留这一点,因为我知道这一点会起作用。having子句就像group by的where子句,因此当您使用group by时,如果您想在其中一个聚合值上使用where,则需要在group by之后使用having子句。例如,看看我的解决方案,这两个查询不一定是,你可以让count(*)大于1,而不是用另一个查询来包装它,并使用where子句,而且,如果一名教师教授的课程超过两门,且两名学生人数更多,他将被返回两次或更多。最后,用IN(v1,v2,v3)代替OR,这会减慢进程;我意识到我只有B-。现在它将包括“或更好”。@sagi的观点很好。我没想到会有复职教师。我会编辑。我相信您会在where子句中使用count(*)>1,但我从未测试过,因此我将保留这一点,因为我知道这一点会起作用。having子句就像group by的where子句,因此当您使用group by时,如果您想在其中一个聚合值上使用where,则需要在group by之后使用having子句。看看我的解决方案