数据库表字段调整排序上移下移

本文探讨了如何通过使用浮点数排序并结合时间戳作为辅助字段,解决数据库中自定义排序时的精度问题和重复值难题。作者分享了计算排序中间值的方法,并介绍了如何利用LastModified字段创建联合索引来确保排序的稳定性。
摘要由CSDN通过智能技术生成

做之前是一点灵感没有的 看了下别人的做法  数据库,设置浮点字段做排序序号,实现自定义排序

我仿照的做下来 Sort 字段改为 Float 类型

后面在 写代码的时候就发现一点点问题
每次移动位置就会小数点后面加一位这样感觉就不完美了 
而且有几率我要插入的位置 上下两个的 排序值是一样的 导致取出的 中间值也是一样的 ,这就很烦了,谁排在前面还不一定呢

        /// <summary>
        /// 计算排序中间值
        /// 如果小数点位数比beforeValue 和 nextValue 都长 就四舍五入
        /// 这里有风险 返回值 = nextValue 数据库排序规则 上加了辅助字段 最后修改时间 ORDER BY [Sort] desc , LastModified desc 即便一样的 sort值会以时间优先 也添加响应的索引
        /// 如果小数点位数比 beforeValue 和 nextValue 都小 直接返回
        /// </summary>
        /// <param name="beforeValue">数字较大的那个</param>
        /// <param name="nextValue">数字较小的那个</param>
        /// <returns>中间值</returns>
        private double DealSortMiddleValue(double beforeValue, double nextValue)
        {
            if (beforeValue == 0 && nextValue == 0)
            {
                return 0;
            }
            else if (beforeValue == 0)
            {
                return nextValue + 1;
            }
            else if (nextValue == 0)
            {
                return beforeValue - 1;
            }
            else
            {
                // 避免每次插入都增加一个小数位
                // 这里获取小数位较大的那个进行保留位数处理
                var beforeAccuracy = GetAccuracy(beforeValue);
                var nextAccuracy = GetAccuracy(nextValue);
                var maxAccuracy = nextAccuracy > beforeAccuracy ? nextAccuracy : beforeAccuracy;
                var middleValue = (beforeValue + nextValue) / 2;
                var middleAccuracy = GetAccuracy(middleValue);

                if (middleAccuracy > maxAccuracy)
                {
                    return Math.Round(middleValue, maxAccuracy);
                }
                else
                {
                    return middleValue;
                }
            }
        }

        // 计算数字有多少位小数
        private int GetAccuracy(double value)
        {
            string strValue = value.ToString();
            if (strValue.Contains("."))
            {
                int maxLength = strValue.Length;
                int index = strValue.IndexOf(".");
                return maxLength - 1 - index;
            }
            else
            {
                return 0;
            }
        }

后面想到了 我的这个修改时间字段  每次修改排序我都会更新时间



拿这个 字段 和 Sort 做一个联合索引
排序的时候就按照这样排序就OK了  即便我的值和其他条数据的 sort 是一样的,但是 我的  LastModified  肯定比其他的时间要大

ORDER BY [Sort] desc , LastModified desc 



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值