多选框–逗号分隔
最近在开发中遇到一个问题,比如前端有一个多选框,多选框里可以选择多个值,每一个值都有自己的编码和名称,比如下面这张表:
名称为Java的对应编码为A,名称为JavaScript的对应编码为B,前端多选框中假如选中了Java,那么往后端传的时候传的是Java编码–A。
且前端往后端传的值格式为字符串形式,也就是’A,B,E’形式,数据库中存入的字段形式也是’A,B,E’形式,此时如果需要后端从数据库中将字符串’A,B,E’对应的’codeTypeName’返回给前端,且以’Java,JavaScript,C#'的形式返回,该怎么做?
首先我们要做的就是在codeType中将’A,B,E’对应的codeTypeName找出来,可以用FIND_IN_SET()函数,这个函数的作用是允许您在逗号分隔的字符串列表中查找指定字符串的位置。
FIND_IN_SET(needle,haystack)函数接受两个参数:
第一个参数needle是要查找的字符串。
第二个参数haystack是要搜索的逗号分隔的字符串列表
FIND_IN_SET()函数根据参数的值返回一个整数或一个NULL值:
如果needle或haystack为NULL,则函数返回NULL值。
如果needle不在haystack中,或者haystack是空字符串,则返回零。
如果needle在haystack中,则返回一个正整数。
此时的SQL语句为:
select codeTypeName
from code_type
where FIND_IN_SET(codeType, 'A,B,E') > 0;
# codeType这个参数只能是单个数据,比如‘a’或‘b’或‘c’,不能是‘a,b’这样的,需要这样的可以参考下面sql
<select id="queryYunJiaGuanLi1" resultType="com.ccccdrc.dolphin.cargoweb.aasc.vo.YunJiaChaXunDto" >
select a.*,b.*,a.id as yunJiaWeiHu , b.id as chuanQiWeiHu from `aasc_yun_jia_ming_xi`as a
inner join `aasc_yun_jia_wei_hu` as b on a.yun_jia_wei_hu = b.id
<where>
<if test="yunJiaChaXunDto.banCi != null and yunJiaChaXunDto.banCi != ''">
<foreach item="item" index="index" collection="yunJiaChaXunDto.banCi.split(',')" separator=" ">
and FIND_IN_SET(#{item},b.ban_ci)>0
</foreach>
</if>
</where>
${ew.customSqlSegment}
</select>
结果为:
但是前端需要我们传回的是一个字符串形式的,而我们现在查询出的是分组的形式,所以又需要第二个函数—GROUP_CONCAT()函数,
MySQL GROUP_CONCAT()函数将组中的字符串连接成为具有各种选项的单个字符串。
GROUP_CONCAT(DISTINCT expression
ORDER BY expression
SEPARATOR sep);
DISTINCT子句用于在连接分组之前消除组中的重复值。
ORDER BY子句允许您在连接之前按升序或降序排序值。 默认情况下,它按升序排序值。 如果要按降序对值进行排序,则需要明确指定DESC选项。
SEPARATOR指定在组中的值之间插入的文字值。如果不指定分隔符,则GROUP_CONCAT函数使用逗号(,)作为默认分隔符。
此时的SQL语句为:
select GROUP_CONCAT(codeTypeName)
from code_type
where FIND_IN_SET(codeType, 'A,B,E') > 0;
结果为: