[英]Alternative to bubble sort in MySQL
问题实际上很可能出在这里,我不是在问google(或stackoverflow)正确的问题,但是由于这个简单的事情使我发疯。 很抱歉发布了很长时间,但是想弄清楚情况。
我有一个记录ID,person_name,优先级的mysql表
ID和person_name的含义不言而喻,优先级用于对记录降序排序-最高=最高优先级。
我有以下记录,为简单起见,ID对应于排序顺序:
1, "John A", 3
2, "John B", 2
3, "John C", 1
4, "John D", 0
在我从其他计算机的导出中导入记录之前,这一直很好,突然之间有两个优先级相同的记录。
1, "John A", 3
2, "John B", 2
3, "John C", 1
5, "John E", 1
4, "John D", 0
现在按优先级DESC,名称ASC,ID3和ID5对记录进行排序时,将按字母顺序排序,这与情况不符。 如果用户希望将ID5的优先级更改为高于ID2,我不能仅仅增加优先级,因为它会匹配ID2,并且由于字母顺序,ID5会显示在ID2以下。
问题:是否有比这更有效的方法,或者是完全不同的方法:
如果有多个带有NEAREST_PRIORITY的记录,这实际上将不能很好地工作...
感谢您阅读冗长的帖子和任何想法。
有趣的问题,这取决于您如何解决导入记录的优先级冲突。 我们假设,如果发生冲突,则导入的记录将具有优先权。 导入之前,将所有优先级乘以2,然后导入新记录,但将其优先级乘以2,并在导入期间加1。 现在您将拥有:
1, "John A", 6
2, "John B", 4
5, "John E", 3
3, "John C", 2
4, "John D", 0
如果您需要保持优先级连续,或者需要执行很多导入操作,则必须做一些工作来重置数字,但是至少顺序是正确的。
您可以对发生冲突的优先级更改使用相同的解决方案,将其乘以2,然后将新优先级设置为新优先级+1。因此,将ID4移至ID5之前,其新优先级将为(3 * 2)+ 1和您将拥有:
1, "John A", 12
2, "John B", 8
4, "John D", 7
5, "John E", 6
3, "John C", 4
同样,如果您这样做,事情将会迅速升级,因此您可能想要重置数字。 此答案显示了您可以调整的顺序编号示例。
我在考虑链接列表并实现优先级表,例如
{ id, userId, comesAfterUserId, comesBeforeUserId }
然后,任何优先级移动都只能更改两个条目。 但是我不知道如何直接在SQL中对它进行排序,因此您必须在应用程序中进行处理。 我觉得这是一个更优雅的解决方案,但乘以2的倍数也应该有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.