MySQL反排序

时间:2014-07-11 17:15:07

标签: mysql sorting

最近我有一个需要异常结果集的任务。

让我们想象下一个数据源:

[level]
[1]
[2]
[1]
[3]
[2]
[3]
[1]

从这个列表中我需要按下一个顺序选择值:1,2,3,1,2,3,1

使用常规的MySQL排序我可以获得的是此列的组结果,因此我得到类似SORT BY level asc 1,1,1,2,2,3,3的内容。

我尝试过有条件的排序,但它似乎没有帮助,排序的核心本身就是我想要得到的 - 我希望它能够均匀地传播,而不是分组。但在同一个地方,我需要严格的命令来保存。

现在我只是没有想法,并会欣赏任何建议

更新

我没有其他专栏用于其他排序。当然,表中有很多列,但这些列都与这一列(级别)无关。

我知道我以后可以在应用程序代码中做各种技巧,但我想知道这是否可行。

到目前为止,我已经尝试过没有运气了:

set @a = 0;
...
order by
 case
 when (@a <= 3) then level = @a := @a + 1
 when (@a > 3) then level = @a := 1
end desc

我知道为什么那不起作用。我只是想尝试更新我的过程。

如果你想知道为什么我需要它,我们可以说我希望稍后将结果集限制为3并确保获得三个级别的项目。小组对我不起作用,因为我可能还希望在此之上应用额外的排序。

1 个答案:

答案 0 :(得分:0)

你说它的方式,排序也没有多大意义。你可以这样做(这里假设你从其他问题中使用PHP):

$res = mysql_query("SELECT level, COUNT(level) FROM table GROUP BY level ORDER BY level");
$levels = [];
while ($row = mysql_fetch_row($res)
    $levels[$row[0]] = $row[1];

while (array_sum($levels))
     foreach ($levels as $level => &$count)
         if ($count)
         {
             $count--;
             echo "{$level},";
         }

观察拥有这样一张桌子的无意义,我认为你的桌子中还有一些其他字段可以用来按照你想要的方式对这些东西进行排序。例如:

[username], [level]
foo         1
bar         2
foo         2
bar         3
foo         3
bar         1

在这种情况下,您可以使用:

SELECT level FROM table ORDER BY username, level

在此示例中,即使未选择username作为结果的一部分,也可以使用它来对其进行排序,结果会有1,2,3,1,2,3