用户登录
用户注册

分享至

自动分割以”,”分隔的参数进行匹配

  • 作者: 八卦八股
  • 来源: 51数据库
  • 2021-07-30

mysql 的 find_in_set函数使用方法

有个表里面有个type字段,他存储的是字段类型,有 "1条件,2条件,3条件,4条件 …“等等
现在有个对象里面选择的几个标签"1条件,3条件…”,要跟上表进行匹配查询,那么我们该怎么拆分type进行查询呢
这就要我们的find_in_set出马的时候到了!
先上代码

<select id="newQueryRentalHousing"  resultType="com.lianjia.user.dto.FocusHouseInfoDto">
    SELECT
    rh.uid,
    ri.balcony,
    ri.usage_area,
    ch.street,
    ch.address,
    ch.rent_way,
    l.`label_coment`
    FROM rental_housing rh
    LEFT JOIN client_house ch ON ch.id = rh.rental_houe_id
    LEFT JOIN room_information ri ON rh.room_id = ri.id
    LEFT JOIN label l ON ri.id =l.`room_id`
    WHERE
    rh.rent = 0
    AND  ri.delete_falge=1
    <if test="rentalDemand.otherRequirements!=null">
        AND
        <foreach collection="rentalDemand.otherRequirements.split(',')" item="item"
                 separator="and">
            FIND_IN_SET(#{item},l.`label_coment`)
        </foreach>
    </if>
        ORDER BY ri.order_time DESC limit 100
    </select>

代码中以“,”拆分otherRequirements(1条件,3条件…)字段与label_coment(1条件,2条件,3条件,4条件 …)循环进行匹配获取查询结果

MySQL手册中find_in_set函数的语法解释:

FIND_IN_SET(str,strlist)

str 要查询的字符串
strlist 字段名 参数以”,”分隔 如 (1,2,6,8,10,22)
查询字段(strlist)中包含(str)的结果,返回结果为null或记录

假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。

例子1:

SELECT FIND_IN_SET('b', 'a,b,c,d');

结果:2

因为b 在strlist集合中放在2的位置 从1开始

select FIND_IN_SET(‘1’, ‘1’); 返回 就是1 这时候的strlist集合有点特殊 只有一个字符串 其实就是要求前一个字符串 一定要在后一个字符串集合中才返回大于0的数

select FIND_IN_SET('2', '1,2'); 返回2
select FIND_IN_SET('6', '1'); 返回0 strlist中不存在str,所以返回0

find_in_set()和like的区别:

几个例子:

SELECT * from C_PURCHASINGMASTERDATA where FIND_IN_SET(EKGRP,'C54,C02,C14,C60,C06,C61,C53,C51,C12,C08,C03,C07')
SELECT * from C_PURCHASINGMASTERDATA where EKGRP in ('C54','C02','C14','C60','C06','C61','C53','C51','C12','C08','C03','C07')

也就是这两个sql是查询的效果是相同的
所以如果list是常量,则可以直接用IN, 否则要用find_in_set()函数。

软件
前端设计
程序设计
Java相关