我有一个像这样的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()也无济于事,因为这就是原因所在。
答案 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中进行选择,并在排名上对原始表格进行内部联接,则可以通过这种方式使其正常工作。