2014.5.5数据库设计:一对多关系的表的设计和查询技巧

数据库设计:一对多关系的设计

表的设计原理

在实际开发过程中往往会出现一张表的一条数据(a表)会引用另外一张表(b表)的多条数据:

a表:


b表:

a表中cresist的类型是varchar,它冗余了b表中的多个主键ID,以一定规则存在(此处为以英文逗号间隔),b表中主键的类型是int

问题描述

我们需要查看的不只是类似“1,2”这种结果,相反,我们想看到的结果是“位置偏远,配套不齐”,如何才能得到这样的结果呢?

解决方式

方式一:先查询出a表所有的数据,再遍历所有数据,取出cresist字段的值,解析(以逗号分隔开来)后从关联表查询每一条数据,取出实际内容拼接(执行sql次数:>1+n*i次):


方式二(效率更高):先查询出a表所有的数据,再遍历所有数据,取出cresist字段的值,通过sql实现内容拼接,直接得到结果(执行sql次数:=1 + n*1次):


这里使用了MySQL的两个函数:GROUP_CONCAT(将满足条件的结果拼接起来,跨多条数据的拼接,不同于CONCAT:一条数据之间的拼接)和FIND_IN_SET(判断第一个参数是否在第二个参数中出现),效果如下:

(FIND_IN_SET)

(GROUP_CONCAT + FIND_IN_SET)

方式三(能否实现?):通过一条sql语句查询出结果,不再进行遍历(执行sql次数:=1次):


结论:可以使用1条sql语句联合查询结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来的我比现在的我更优秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值