PHP学院的中学生 2020-08-19 16:58:18 324次浏览 0条回复 0 1 0

MySQL在select的时候,如果where后面是in结构,查询出来的结果不会按in里面的数据顺序进行返回,而是有默认的排序。通常用到in的时候,是在update做批量更新的时候,这种情况不需要查询in结构里面的数据,所以不会出现数据紊乱的情况。但是,如果需要获取多条数据,并且这多条数据,在数据库中不是自然顺序的时候,select出来的数据会对查询出来的数据进行默认的排序,经自身的测试,应该是按照某字段的升序排序(测试不是很严谨,仅直观的感受)。比如用in(2,3,5,4,7,6,10,9,8)来查询数据(in结构中的数据是ID值),查询出来的结果顺序是以ID顺序2,3,4,5,6,7,8,9,10来返回的。如果程序中要对select出来的数据再进行处理,那在处理ID=5的时候,其实处理的是ID=4的记录数据,同样地,处理ID=4的时候,其实处理的是ID=5的数据,这样就把数据库ID=4的数据计算结果值给了程序中ID=5的情况。这样就出现了“张冠李戴”的现象。

解决办法:亲测都可行。

第一种:order by find_in_set(ID,'2,3,5,4,7,6,10,9,8')

例子:SELECT * from tb_check WHERE ID in (2,3,5,4,7,6,10,9,8) ORDER BY FIND_IN_SET(ID,'2,3,5,4,7,6,10,9,8')

第二种:order by substring_index('2,3,5,4,7,6,10,9,8',ID,1)

例子:SELECT * from tb_check WHERE ID in (2,3,5,4,7,6,10,9,8) ORDER BY SUBSTRING_INDEX('2,3,5,4,7,6,10,9,8',ID,1)

第三种:order by field

SELECT * from tb_check WHERE ID in (2,3,5,4,7,6,10,9,8) ORDER BY FIELD(ID,2,3,5,4,7,6,10,9,8)(注意:这里没有单引号)

觉得很赞
亿速云
    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册