我有两张桌子(多对多):
+-------------------+ | 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个表?
如何将两个表合并为一个?
另外,我如何显示(使用工会)居住在洛杉矶的人的姓名
答案 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