两个表上的SQL查找;

时间:2016-02-22 22:10:49

标签: mysql sql

数据库在这里:http://sqlfiddle.com/#!9/bf0171

我想找到大卫教授"大卫教授"类。但是,查找结果是:

Select Student.name from Student, Teacher where Teacher.s_id =Student.id and Teacher.name="Prof. David";
+------+
| name |
+------+
| Tom  |
| John |
| Mary |
| Tom  |
| John |
| Mary |
+------+

我想结果应该是" Tom"和"约翰"只要。问题是什么?

4 个答案:

答案 0 :(得分:2)

如果StudentTeacher之间没有加入条件,您将获得Cartesian product(来自Student的所有记录以及来自Teacher的所有记录)。

你可能意味着:

SELECT
    Student.name
FROM Student s
JOIN Teacher t
  ON t.s_id = s.id
WHERE Teacher.name="Prof. David";

对于新的SQL学习者,我强烈建议明确使用JOINLEFT JOIN等,而不是隐式加入WHERE子句。它将有助于减少您执行的意外笛卡尔积的数量。

答案 1 :(得分:1)

问题是您有两个表,并且您正在使用查询对这些表执行笛卡尔连接。因此,您在结果中获得3x2 = 6行,每位教师都会显示所有3名学生的姓名。您必须根据模式中的外键关系以逻辑方式连接表。

例如:

Select A.field1, B.field2 from A join B on A.id = B.a_id

答案 2 :(得分:1)

要了解问题所在,请尝试以下方法:

Select Student.name, Teacher.name from Student, Teacher

您将得到一个结果,每个学生都与每位老师合并,无论是否与其他学生有任何关系。您需要添加一个条件来检查教师和学生是否相关:

Select Student.name, Teacher.name from Student, Teacher where Teacher.s_id = Student.id

一旦有了这些条件,您就可以添加更多条件,例如只列出给定教师的学生。

Select Student.name from Student, Teacher where Teacher.s_id = Student.id and Teacher.name=...

答案 3 :(得分:0)

您需要在where处添加join子句。我想你正在努力选择在特定班级中有特定教师的学生。所以,例如,如果你有:

table Student with columns: student_id, name
table Teacher with columns: teacher_id, name
table Class with columns: class_id, class_name, teacher_id
table Class_Assignment with columns class_id, student_id

然后你的查询将是:

Select Student.name from Student, teacher, class_assignment
   where Student.student_id = class_assignment.student_id
   and Teacher.teacher_id = class_assignment.teacher_id
   and Teacher.name="Prof. David";