簡體   English   中英

MySQL中冒泡排序的替代方法

[英]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以下。

問題:是否有比這更有效的方法,或者是完全不同的方法:

  1. NEAREST_PRIORITY =確定具有更高優先級的最近記錄的優先級
  2. 將優先級> NEAREST_PRIORITY的所有記錄的優先級提高1
  3. 設置當前記錄優先級= NEAREST_PRIORITY + 1

如果有多個帶有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM