一对多关系和多对多关系的实现
先来实现一对多关系
什么是一对多关系呢?
一对多是关系型数据中两个表之间的一种关系,该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。
[br]-----我是分割线------[br]
举例
帖子与用户之间的关系
现有两张表,帖子表(tab_topic),用户表(tab_user)
每一个用户可以发多篇帖,但是每篇贴只能对应一个用户
如果要实现这种关系,可以使用的设计
tab_user表中的各列
userId | name|....(省略)
1 老虎
2 武松
3 泰格
tab_topic表中的各列
topicId | userId | title|...(省略)
1 1 标题1
2 1 标题2
3 2 标题3
4 1 标题4
表的设计不是很难,现在来看查询
userId = 1的用户发了多少张贴
select count(*) from tab_topic where userId = 1
topicId = 1的帖子是谁发的呢?
select name from tab_user where userId in ( select usrId from tab_topic where topicId = 1 )
多对多关系的实现
A表的中一行可以对应B表中的多行,而B表中的一行也可以对应A表中的多行
举例
学生与课程之间的关系
一个学生可以选修多门课程
一门课程可以被多名学生选修
学生表(tab_student )中的各行各列
stuId | name|..(省略)
1 老虎
2 武松
3 张三
课程表(tab_course)中的各行各列
courseId | name | teacher|..(省略)
1 c语言 A老师
2 java B老师
3 php c老师
似乎在两张表中不能很好的反映学生与课程的关系,那就建立第三张表吧
tab_student_course中的各行各列
Id | stuId| courseId|..(省略)
1 1 1
2 1 2
3 1 3
4 2 3
从表tab_student_course中可以看出老虎选了三门课,php的有2个人选修了
查询
php有多少个人选修了
Select count(*) from tab_student_course where courseId = 3
老虎选修了那几门课程
select name from tab_course where courseId in ( select couresId from tab_student_course where stuId = 1 )