项目中常见问题及解决方案记录

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 

根据权值从小到大排列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值