连接2个表并保存到第三个重复项

时间:2014-01-08 00:26:43

标签: mysql sql

我有两张桌子(多对多):

学生

+-------------------+
| ids | Name |Address|
+-------------------+
| 1  | Bob  |LA     |  
| 2  | Ace  |NY     | 
| 3  | Test |LA     |    
+-------------------+

教授

+-------------------+
| idp | Name |Address|
+-------------------+
| 1  | Jon  |LA     |  
| 2  | Taz  |LA     | 
| 3  | Test |LA     |    
+-------------------+

我想展示所有以Jon为教授的学生。为了做到这一点,我想我需要在idp和id上使用外键的第3个表?

如何将两个表合并为一个?

另外,我如何显示(使用工会)居住在洛杉矶的人的姓名

3 个答案:

答案 0 :(得分:1)

只有一位教授的学生:

第三个表格不是必需的,只需在学生表中添加该外键(idp =教授ID)即可:

SELECT * FROM Student 
    JOIN Professor ON Student.idp = Professor.idp 
    WHERE Professor.Name = 'Jon' 

这样你就可以得到所有以Jon为教授的学生。

学生多位教授

如果学生有多位教授。当然,你需要第三张桌子。有点像这样:

Student_Professor {StudentID, ProfessorID} // Compound key

创建第三个表的另一种方法是:

Student_Professor {StudentProfessorID, StudentID, ProfessorID} 

其中StudentProfessorID是您的主键和其他外键..这种情况的优点是您只需要处理一个主键而不是复合键。

<强>查询

假设第三个表是这样的:Student_Professor {StudentID,ProfessorID}

我们可以使用:

SELECT * FROM Student_Professor 
    JOIN Student ON Student.StudentID = Student_Professor.StudentID
    JOIN Professor ON Professor.ProfessorID = Student_Professor.ProfessorID
WHERE Professor.Name = 'Jon' 

答案 1 :(得分:0)

要过滤数据,您需要使用'where'子句

http://www.w3schools.com/sql/sql_where.asp

where子句将在语句的末尾出现,并且具有以下语法:

SELECT *columns* FROM *table* WHERE *some condition*

union运算符用于将两个语句连接在一起。

http://www.w3schools.com/sql/sql_union.asp

所以,

SELECT *columns* FROM *table*
UNION
SELECT *columns* FROM *table*

在联盟的末尾添加一个where子句,你就可以得到洛杉矶人的答案。

要将具有多对多关系的两个表连接在一起,您需要使用所谓的映射表。也就是说,一个有两列的表。一个用于教授身份,另一个用于学生身份,用于描述每位教授与每位学生之间存在的每一种关系。

答案 2 :(得分:0)

假设每个学生都有每位教授,您可以通过交叉联接在联结表中创建记录,如下所示:MySQL Insert Records from Multiple Tables to New Table

交叉连接会将表A中的每一行与表B中的每一行连接起来,从而生成笛卡尔积。

假设一个名为Student_Professor的表,其中包含StudentId和ProfessorId:

insert into Student_Professor (StudentId, ProfessorId)
select Student.ids, Professor.idp
from Student
cross join Professor