如何在一对多的关系中把两表Join成一行

如果你有一个一对多的关系,您想对两个表执行Join,但你只想要将每一个“一对多”关系中产生一行,你可以参考下面:

一个很容易理解的例子,比如博客园的随笔(Post)和评论(comment)两个表,如下图:

ScreenShot008

如果你想获取随笔的ID, Title 和 一个评论的ID, 内容的话,有以下两个方案:

方案一:

ScreenShot007


方案二:

ScreenShot006

第一个方案在有很少随笔,但是每个随笔有很多评论的情况下更优;

第二个方案在随笔数目多,但是每个随笔的评论较少的情况下更优;

以下是MySQLInner Join和Left Join在一对一和一对多情况下的演示: 假设我们有两个,一个是学生(students),另一个是课程(courses),它们之间的关系是一个学生可以选修多门课程,而一门课程也可以被多个学生选修。 1. 一对一情况下的Inner Join: 假设我们有两个,一个是订单(orders),另一个是客户(customers),每个订单只属于一个客户,每个客户也只有一个订单。 ```sql SELECT * FROM orders INNER JOIN customers ON orders.customer_id = customers.customer_id; ``` 上述SQL语句将返回一个包含订单和客户信息的,其一行都是一个订单和它所属的客户的信息。 2. 一对多情况下的Inner Join: 假设我们有两个,一个是学生(students),另一个是课程(courses),它们之间的关系是一个学生可以选修多门课程,而一门课程也可以被多个学生选修。 ```sql SELECT * FROM students INNER JOIN courses ON students.course_id = courses.course_id; ``` 上述SQL语句将返回一个包含学生和课程信息的,其一行都是一个学生和他所选修的课程的信息。如果一个学生选修了多门课程,那么他的信息将在结果集出现多次。 3. 一对一情况下的Left Join: 假设我们有两个,一个是订单(orders),另一个是客户(customers),每个订单只属于一个客户,每个客户也只有一个订单。 ```sql SELECT * FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id; ``` 上述SQL语句将返回一个包含所有客户信息和他们的订单信息的,其一行都是一个客户和他的订单的信息。如果一个客户没有订单,那么他的信息也会在结果集出现,但是订单信息将会是NULL。 4. 一对多情况下的Left Join: 假设我们有两个,一个是学生(students),另一个是课程(courses),它们之间的关系是一个学生可以选修多门课程,而一门课程也可以被多个学生选修。 ```sql SELECT * FROM courses LEFT JOIN students ON courses.course_id = students.course_id; ``` 上述SQL语句将返回一个包含所有课程信息和选修该课程的学生信息的,其一行都是一门课程和选修该课程的学生的信息。如果一门课程没有学生选修,那么它的信息也会在结果集出现,但是学生信息将会是NULL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值