[Mysql函数]另一种处理一对多问题的思路find_in_set

场景

当一对多关系中,“多”的个数很少时可用这种思路,比如分类、标签、权限归属等常用场景。

处理方法

在“一”的表中给个String类型的集合字段,存入“多”的id,并用“,”分隔。正向查询(比如某个物品带有哪些标签)根据该字段拆分后索引“多”的那个表即可,要进行反向查询(比如带有某个标签的物品)时只用筛选该字段即可,而最好的筛选的方法就是用find_in_set函数。

函数sql样例

直接使用find_in_set函数即可:

SELECT * FROM `tablename` WHERE FIND_IN_SET('targetId',targets_column);

其他思路

另外有个思路是用like来筛选,但是要注意id包含关系,比如(12,23)直接用(like %2%)肯定是能得到错误的结果的。解决思路有两种:

  1. targets_column中规范存储,前后都有分隔符,比如(,12,13,),筛选时用(like %,2,%)可避免得到错误结果。
  2. 将“多”表id规范,比如预估标签不会超过100个,id就从100、101、102开始,这样用like也不会有问题。

总结

find_in_set是mysql的函数,如果业务数据库确定不会变,最好还是用这个函数处理,如果可能会迁移到oracle等其他数据库,还是用like比较好(虽然oracle也可以处理兼容这个函数,但是毕竟多个工作量)。
最后,切记在“多”的量不大时才采用这种方法,如果量大了还是用中间表处理更合适。

你可能感兴趣的:([Mysql函数]另一种处理一对多问题的思路find_in_set)