Mysql-所选时逗号分隔

多选框–逗号分隔

最近在开发中遇到一个问题,比如前端有一个多选框,多选框里可以选择多个值,每一个值都有自己的编码和名称,比如下面这张表:

名称为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;

结果为:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值