前几天工作上遇到一个问题,在mysql数据查询的时候,使用的是in条件,而结果需要根据in来进行排序,当时尝试了几次都没成功,后来在度娘的帮助下,找到了解决办法:
创新互联建站专业为企业提供曲阳网站建设、曲阳做网站、曲阳网站设计、曲阳网站制作等企业网站建设、网页设计与制作、曲阳企业网站模板建站服务,十余年曲阳做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
select * from table_name where id in (6,2,1,10,5,7..)
查询的结果和in中的顺序并不一致,也就是说在批量查询时,mysql的查询并不是按照in中的值得顺序来查询的。那怎么才能保证和in查询中的顺序相同呢?
查询了资料发现有两种方式可以对in查询的结果进行排序。一种是order by find_in_set,另外一种是order by substring_index
1、select * from table_name where id in (6,2,1,10,5,7..) order by find_in_set(id,'6,2,1,10,5,7');
2、select * from table_name where id in (6,2,1,10,5,7..) order by substring_index('6,2,1,10,5,7',id,1);
创建表
该表的记录如下:
添加两个索引:
通过 explain 来查看:
会命中两条索引,但实际只用了 idx_v1,即使实际查询用联合索引更好,也依然只用了 idx_v1。
之前的测试,发现用的是第一个,我们删除索引,把之前的索引语句顺序换一下:
发现用的是第一个。
create table test_change_column(
id int,
name1 varchar(16),
name2 varchar(16)
);
alter table test_change_column modify column name1 varchar(16) after name2;
以上是一个例子,可以一试。注意在改变字段顺序时要指定这个字段的类型。
你的需求可以实现,并不困难,但是我建议你:不要在乎列的顺序,不要依赖列的顺序,使用select xxx,yyy,zzz...代替select *,使用insert into tab(xx,yyy,zzz) values (...)代替insert into tab values(...)语句。
没发现啥好方法,要么就删掉重新写字段好了。
为啥管这个呢,排列顺序无所谓啊;只是看着不一样,你插入或者修改的时候都没有影响啊。
SQL的要点是中抽象应用程序以避免数据存储格式。你应该总是以你想要检索数据的意愿指定顺序。例如:
SELECT col_name1, col_name2, col_name3 FROM tbl_name;
将以col_name1、col_name2、col_name3的顺序返回列,而:
SELECT col_name1, col_name3, col_name2 FROM tbl_name;
将以col_name1、col_name3、col_name2的顺序返回列。
在一个应用程序中,你应该决不基于他们的位置使用SELECT * 检索列,因为被返回的列的顺序永远不能保证;对你的数据库的一个简单改变可能导致你的应用程序相当有戏剧性地失败。
不管怎样,如果你想要改变列的顺序,你可以这样做:
以正确的列顺序创建一张新表。
执行INSERT INTO new_table SELECT fields-in-new_table-order FROM old_table.
删除或改名old_table。
ALTER TABLE new_table RENAME old_table。