MySQL中的字符串精确匹配
在开发过程中,有时我们会采用,
拼接的方式去拼接一些数据,比如说使用LIKE进行模糊查询。但是在查询的时候如果采用LIKE关键字确实可以查到,但是查询的结果并不是真正的精准的。
比如说现在有一条数据是这样的:“123,23,3”,此时我们想要在这个字符串中查询到包含“23”这个字符的数据(只能是23,不能包含123),如果我们采用LIKE %23%的这种方式就会出现问题,因为123也符合查询的规则。
此时我们可以采用FIND_IN_SET()函数来解决这种问题。
举例:
假设现在有字段category,其中一条数据是这样的:1689461018770681857,1689461109384425474,1681118229479022593
我们想要查询到包含1689461109384425474
的数据,我们可以通过LIKE进行模糊查询得到。
SELECT
category
FROM
ucenter_category_info uci
WHERE
uci.category LIKE '%1689461109384425474%'
使用LIKE进行模糊查询当然可以查询到包含1689461109384425474
的数据,但是也是存在隐患的,比如说
11689461109384425474,1681118229479022593
这种数据,也是满足上述代码的模糊查询的条件的,结果并不是非常可靠。
FIND_IN_SET()函数
FIND_IN_SET()函数可以精确的匹配到数据中是否包含指定的字符。
举例:
SELECT
category
FROM
ucenter_category_info uci
WHERE
FIND_IN_SET('1689461109384425474', uci.category)
使用**FIND_IN_SET()**函数对于11689461109384425474,1681118229479022593
这种数据的不会匹配上,而对于1689461018770681857,1689461109384425474,1681118229479022593
这种数据的则可以匹配上,相比较于like更加准确,得到的结果也更加可靠。
注意:使用like进行模糊查询时,采用LIKE '%abc%'是不会走索引的,如果采用的是LIKE 'abc%'的格式则可以通过左匹配的原则去走索引的;而对于FIND_IN_SET()函数来说,是会进行全表扫描,是不会走索引的,所以在使用时也需要考虑是否符合实际的场景。
可以考虑先通过JOIN关联表是通过添加筛选条件进行过滤,在得出的虚拟表中再使用FIND_IN_SET()函数来进行精确匹配。