1. 数据库中排序问题,要将下面的数据排序成右边的格式。
location(varchar) --> location(排序后的)
1-3 1-3
1-40 1-20
1-20 1-40
2-A-50-2 2-30
2-30 2-A-8-6
2-B-7-1 2-A-50-2
2-A-8-6 2-B-7-1
10-3 10-3
也就是说,先根据'-'左边的字符从小到大排序,再根据'-'右边的数字从小到大排序,字母排在数字的后面。
我们最开始的方案是 使用数据库的 order by location asc , 但是结果并不是对的,因为字符串默认是按英文字典顺序排列的。排序的结果如下:
location(varchar) --> location(排序后的)
1-3 1-3
1-40 1-20
1-20 1-40
2-A-50-2 10-3
2-30 2-30
2-B-7-1 2-A-50-2
2-A-8-6 2-A-8-6
10-3 2-B-7-1
结果很明显并不是想要的。因此想到第二种方案将所有的数据查出来用java来排序,这种方案实现起来并不难,但是考虑到这种数据会经常被查询,且一次查出来的数据量并不小,如果每次都要进行排序,势必会浪费些许性能。
于是经过分析提出第3种方案,在数据库中冗余一个字段“权重”--> weight (int32),根据location字段制定相应的算法,计算其权重并保存,以后每次根据权重值进行排序,数据库对数值的排序是非常高效的。
权重算法如下:
将location按"-"分割成多段,确定每段的最大值。假设每段的最大值为100,那么加上A-Z最大值也就是126。
对每一段取权值,然后将所有的值字符串相加后,末尾补零,作为其最后的权值:
location(varchar) --> 每段权值相加 --> 权值 --> location(排序后的)
1-3 001003000000 1003000000 1-3
1-40 001040000000 1040000000 1-20
1-20 001020000000 1020000000 1-40
2-A-50-2 002101050002 2101050002 2-30
2-30 002030000000 2030000000 2-A-8-6
2-B-7-1 002102007001 2102007001 2-A-50-2
2-A-8-6 002100008006 2100008006 2-B-7-1
10-3 010003000000 10003000000 10-3
根据权值从小到大排列。