Gordon Linoff is right:在SQL,表確實沒有內在的順序。但是,仍然有一種方法可以爲您的案例分配索引。唯一的問題是,這個命令是不確定的,一個1可能與一個2組合在一起,不一定是跟隨它的那個(按照您可能期望的任何特定順序)。也就是說,最終結果可能與您的示例類似:
num cir index
--- --- -----
1 1 1
2 2 1
3 3 1
4 1 2
5 2 2
6 3 2
7 1 3
8 2 3
9 3 3
但它很可能是例如這個代替:
num cir index
--- --- -----
7 1 1
2 2 1
3 3 1
4 1 2
8 2 2
6 3 2
1 1 3
5 2 3
9 3 3
如果num
不是「秩序井然」,因爲你把它(因此,我假設,不能用於排序)。
的想法是排序的cir
列中的數據集只
num cir
--- ---
1 1
4 1
7 1
2 2
5 2
8 2
3 3
6 3
9 3
,然後用變量賦值來產生index
值
num cir index
--- --- -----
1 1 1 1
4 1 2 2
7 1 3 3
2 2 1 -> 1
5 2 2 2
8 2 3 3
3 3 1 1
6 3 2 2
9 3 3 3
方法如下:
SELECT
num,
cir,
`index`
FROM (
SELECT
num,
@index := @index * (cir = @lastcir) + 1 AS `index`,
@lastcir := cir AS cir
FROM
yourtable,
(SELECT @index := 0, @lastcir := 0) v
ORDER BY
cir
) s
ORDER BY
`index`,
cir
;
可以猜到,這個表達式
@index := @index * (cir = @lastcir) + 1
是分配索引的那個。基本上,如果你刪除* (cir = @lastcir)
部分,你會得到
@index := @index + 1
這可能不需要解釋:它只是增加了@index
值。
每當遇到新的cir
值時(還記得,數據集是在cir
上排序的),還有一點需要重新設置枚舉。在MySQL中,布爾表達式(如cir = @lastcir
)在預期數字的上下文中隱式轉換爲數字,就像算術表達式的上下文一樣。更具體地說,對於true
將其轉換爲1
,對於false
將其轉換爲0
。因此,只要cir
等於@lastcir
(即以前行的cir
),該index
表達基本上等同於@index := @index + 1
,但是當cir
和@lastcir
不同(這意味着我們剛剛遇到一個新的cir
組),表達實際上變成@index := 0 + 1
,即枚舉現在重新開始。
如果你願意,你可以測試這個解決方案at SQL Fiddle。
它看起來像指數剛好等於地板((NUM - 1)/ 3)+ 1,除非我失去了一些東西? – bengoesboom 2013-05-10 19:22:50
糟糕。我只是補充了'num'列以避免一個表僅由一列組成!其實num不是一個有序的。對不起。 – Blaszard 2013-05-10 19:28:03
表格沒有以任何特定的順序存儲,所以如果不在'num'上排序,應該如何確定給定記錄屬於哪個組?你試圖解決的問題的更廣泛的背景是什麼? – eggyal 2013-05-10 19:29:15