FIND_IN_SET是一个用来在数据库中进行字符串匹配的函数,之前我已经在博客中有详细描述。今天想和大家说说的是FIND_IN_SET()函数碰到的一个排序问题。
以我在项目中的实际情况为例:
数据描述:
user_id:( 4,3,1) 对应的user_name('test4','test3','test1')
场景:
给一个ID串“4,3,1” 不同ID用逗号隔开
要求根据这个ID串得到姓名串“test4,test3,test1”
SQL语句:
select group_concat(user_name)
from user
where find_in_set(user_id,'4,3,1')
得到的结果 "test1,test3,test4"
为什么呢 这里就和数据库的查询机制有关,对于find_in_set()函数而言,数据库执行的是全表查询 而数据库默认是按ID索引进行排序的 这就导致有些字段排在后面但因为ID小而导致在结果中出现在前面。那么我们就想,可不可以让查询结果按我们输入的ID串中的顺序输出呢
这时find_in_set()函数又出来了 find_in_set()函数会根据逗号隔开的不同字段的先后给出对应的位置ID 这样办法就出来了。
select group_concat(user_name)
from user
where find_in_set(user_id,'4,3,1')
order by find_in_set(user_id,'4,3,1')可得到的结果还是 "test1,test3,test4"
这是为什么呢 原因就在group_concat()这个函数 这个函数又会进行一次全表查询 然后ID小的字段又靠前了 这样 我们再改一次 加个外套给它
select group_concat(user_name)
from (
select user_name
from user
where find_in_set(user_id,'4,3,1')
order by find_in_set(user_id,'4,3,1')) as temp
这样就通过一个临时表的外套 给他重新按我们排序好的进行二次查询就可以得到我们要的结果了。