数据库设计:一对多关系的设计
表的设计原理
在实际开发过程中往往会出现一张表的一条数据(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语句联合查询结果