MySQL奇怪的订购要求

时间:2011-11-17 12:32:14

标签: mysql sql-order-by

我有一个像这样的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 [...]。它可以是输入数据库的顺序,也可以是随机的。

我有一个由三种类型的项目组成的数据库,它们可以重复。

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

我想做的就是订购它们的岩石,纸张,剪刀,岩石,纸张,剪刀。

我这样做是因为我的大部分数据(> 90%)都是剪刀,当我用分页显示数据时,第一页(LIMIT 0,N)都是剪刀。甚至ORDER BY RAND()也无济于事,因为这就是原因所在。

2 个答案:

答案 0 :(得分:2)

来自Stackoverflow中类似问题的答案的修改:

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),以便使用该列进行排序。

答案 1 :(得分:0)

使用模数怎么样?

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

如果你的id从1开始,并且没有中断,那么第二列将是1,2,3,1,2,3。

如果您从MySQL row generator中进行选择,并在排名上对原始表格进行内部联接,则可以通过这种方式使其正常工作。