1

我有一个具有以下(简化)结构的表:

INT id,
INT type,
INT sort

我需要的是一个 SELECT 以某种方式对我的数据进行排序,以便:

  • 相同类型的所有行都按顺序排列,sort内部按升序排序,并且
  • 一种类型的所有“块”都按它们的最小值排序sort

例子:

如果表格如下所示:

| id | type | sort |
|  1 |   1  |   3  |
|  2 |   3  |   5  |
|  3 |   3  |   1  |
|  4 |   2  |   4  |
|  5 |   1  |   2  |
|  6 |   2  |   6  |

查询应该像这样对结果进行排序:

| id | type | sort |
|  3 |   3  |   1  |
|  2 |   3  |   5  | 
|  5 |   1  |   2  |
|  1 |   1  |   3  | 
|  4 |   2  |   4  |
|  6 |   2  |   6  | 

我希望这足够清楚。

在我看来,这应该是一个非常普遍的要求,但我没有找到任何足够接近的示例,无法自行将其转移到我的用例中。我想我至少不能避免一个子查询,但我自己并没有弄清楚。

任何帮助表示赞赏,在此先感谢。

顺便说一句:我将在 CakePHP 2.1 中使用这个查询,所以如果您知道使用 Cake 的一种舒适的方法,请告诉我。

4

2 回答 2

4

这比最初听起来要简单。我相信以下应该可以解决问题:

SELECT a.id, a.type, a.sort
FROM Some_Table as a
JOIN (SELECT type, MIN(sort) as min
      FROM Some_Table
      GROUP BY type) as b
ON b.type = a.type
ORDER BY b.min, a.type, a.sort

为获得最佳(最快)结果,您可能需要 ( type, sort) 上的索引。如果有两个组具有相同的值(会导致混合行) ,
您需要额外的排序方式a.type(而不是 ( b.min, ))。如果没有重复值,您可以将其删除。a.sortsort

于 2012-05-25T23:07:43.593 回答
0

sort and type are reserved words on some databases and can cause you problems.

Have you tried?

ORDER BY TYPE DESC, SORT ASC
于 2012-05-25T23:02:53.907 回答