MySQL:按组和字段排序

时间:2012-05-25 22:59:02

标签: mysql sql cakephp select sql-order-by

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

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的方法,请告诉我。

2 个答案:

答案 0 :(得分: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

为了获得最佳(最快)的结果,您可能希望获得一个索引(typesort)。
如果有两个具有相同a.type值的组(将导致混合行),您希望按b.min(而不是(a.sortsort))进行其他排序)。如果没有重复值,您可以将其删除。

答案 1 :(得分:0)

排序和类型是某些数据库上的保留字,可能会导致问题。

你尝试过吗?

ORDER BY TYPE DESC, SORT ASC