2011-11-17 50 views
1

我有一個MySQL查詢像這樣:MySQL的怪異排序要求

SELECT 
id, 
CASE 
WHEN (cond1) THEN 1 
WHEN (cond2) THEN 2 
WHEN (cond3) THEN 3 
END `rank` 
FROM `table` 

有沒有辦法把它順序,這樣的結果我得到的將有以交替的順序:

rank 
1 
2 
3 
1 
2 
3 

的1s,2s和3s的順序無關緊要,只要遵循123123 [123]的模式。它可以是他們進入數據庫的順序或隨機的順序。

我有一個由三種類型的項目組成的數據庫,它們可以重複使用。

rock  1 
paper  2 
scissors 3 
rock  1 
rock  1 
rock  1 
scissors 3 
paper  2 

我想要做的是爲了他們的岩石,紙,剪刀,石頭,紙,剪刀,只要它可以達到。

我這樣做是因爲我的大部分數據(> 90%)都是剪刀,當我用分頁顯示數據時,第一頁(極限0,N)都是剪刀。即使ORDER BY RAND()也沒有幫助,因爲這個多數,所以這就是原因。

+0

ahhh !!!你的問題不清楚..你試圖做什麼 –

+0

你如何選擇哪個'訂單'1在另一個1之前?你的問題不完整!請給我們一些其他的細節。 – Marco

+0

你想達到什麼目的? - 高水平。需要更多信息 –

回答

0

如何使用模數?

SELECT id, (((id - 1) % 3) + 1) FROM [...] 

如果您的ID從1開始,並且不間斷地上升,則第二列將變爲1,2,3,1,2,3。

如果您從MySQL row generator中選擇,然後在您的原始表格上進行內部聯接,則可以使其以這種方式工作。從類似的問題的答案#1

2

修改:

SELECT name, cond 
FROM (
    SELECT name, cond, @a := @a+1 AS inc 
     FROM table, (select @a := 0) as SqlVars 
     WHERE cond = 1 
    UNION 
    SELECT name, cond, @b := @b+1 AS inc 
     FROM table, (select @b := 0) as SqlVars 
     WHERE cond = 2 
    UNION 
    SELECT name, cond, @c := @c+1 AS inc 
     FROM table, (select @c := 0) as SqlVars 
     WHERE cond = 3 
) 
ORDER BY inc 

它僅限於有限數量少的情況。如果條件不是固定的有限,那麼你應該按照程序進行。而且它也不是最佳查詢。

另一種方法是在數據庫中添加一個新字段並負責在其中插入一個goog值(MAX的條件相同+ 1),以便使用該列進行排序。

+0

非常漂亮的查詢,可能會完美打擊,但是,您沒有任何關於@a,@b,@c的SQL變量聲明...我從來沒有嘗試過沒有先明確聲明它們例如...(選擇@a:= 0)作爲查詢中的SQLVars作爲「別名」引用,以便創建它們。 – DRapp

+0

完全同意你的看法。一個好的編程習慣必須先申報。甚至更好地把它放在一個程序中。我還提到了這將是慢查詢的缺點。正如我已經提到的,最好的方法是在表格中保留一個額外的字段。它將被聲明爲索引,並且選擇查詢將非常簡單和快速。 –

+0

我編輯了你的答案並放入了SQL Vars聲明(內聯),希望你不要冒犯。 – DRapp