Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在mysql中从多个表中提取数据_Php_Mysql - Fatal编程技术网

Php 在mysql中从多个表中提取数据

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-'的教师队伍。 但所有的老师都喜欢

我的问题是编写一个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-'的教师队伍。

但所有的老师都喜欢

您可以使用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子句。看看我的解决方案