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()函数。
本文地址:https://blog.csdn.net/huluwa10526/article/details/108576405