今天有个业务需求根据主表拼接字符串(数据格式大概是这样:1,2,3,4)去另一张表匹配查询并且拼接。 记得以前做过这样的需求,但是时间太久并且不常用忘记了,今天查阅一些资料后做一个记录以防忘记。
wms_bin表
wms_item_class表
现在想要查询的结果
方案一:最开始的方案是先查用户表,将数据返回到服务器,在代码里进行切割,然后再去t_role表里面去查询对应的名称,返回到程序进行拼接。这样做虽然很简单也很好理解但是效率太低。 方案二:使用FIND_IN_SET函数和GROUP_CONCAT函数进行查询,操作简单,效率高。不过 FIND_IN_SET在数据量大的时候效率比较低,因为它有点类似于like查询。所以当数据量特别大的时候这样做就不太合适了。
总结:如果数据量不是很大可以使用方案三,如果数据量特别大建议使用方案一。因为方案一在数据量很大的情况下添加了索引以后效率会比方案三应该更快。当然最好是建表的时候直接创建一张关联表,这样就可以不使用FIND_IN_SET函数,效率就会很高了
查询语句如下:
select bin_id,bin_code,itemclass_name,(select GROUP_CONCAT(name) from wms_item_class b where FIND_IN_SET(b.item_groupid,(select itemclass_name from wms_bin where bin_id=a.bin_id))) as 'itemclassName'
from wms_bin a;