美文网首页
[Mysql函数]另一种处理一对多问题的思路find_in_se

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

作者: 紫石南 | 来源:发表于2017-08-11 15:38 被阅读82次

    场景

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

    处理方法

    在“一”的表中给个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_se

          本文链接:https://www.haomeiwen.com/subject/raolrxtx.html