关联查询 join 条件为 in 和FIND_IN_SET的问题

源码分析,mysql 2018-11-08

描述

  • 今天在工作做遇到一个实际问题,如下
  • 现在有两个表 A表(userId,classId)B表(classId,grade)
  • 需求

    • a表的classId保存多个b表的classId str字符
    • 现在需要查询所有的userId对应的grade数据
    • 所以一个人UserId 可能对应多个grade
  • 正常的处理逻辑

    select a.userId,b.grade from school_class_member a inner join school_class b on b.classId in (a.classId)

    • 当我使用in查询后 才发现结果并不是我想的那样的,最终结果会以左边的结果为中心,查询每个userid只对应一个grade ,而实际情况是一个userid对应多个grade 所以结果并没有达到我想要的
    • 大量搜索后,发现了原因 因为数据类型的问题,我们直接in(b.idlist)时,读取的b.idlist是字符类型,而in只接受数字,虽说都带有“,”号但实际上是完全不同的.
  • 最后使用FIND_IN_SET解决了问题 如下
    select a.userId,b.gradefrom school_class_member a inner join school_class b on FIND_IN_SET(b.classId,a.classId)

总结

  • mysql还是有很多特性的,不了解基础用法的话 只有在实际中去填自己的这个坑了,所以还是要细心点

本文由 小东@xiaodo 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。