【问题标题】:MySQL: Sort by group and fieldMySQL:按组和字段排序
【发布时间】:2012-05-25 22:59:02
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

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) 上建立索引。
如果有两个组具有相同的sort 值(将导致混合行),您需要按a.type(而不是(b.mina.sort))进行额外排序。如果没有重复值,您可以将其删除。

【讨论】:

  • 我对此进行了测试,但它对我不起作用,但我认为你很接近。编辑:实际上它现在似乎正在工作。
  • 非常感谢 X-Zero!编辑后,这似乎工作正常!
  • 我还是不知道怎么做蛋糕。我知道如何进行子查询和连接,但是如何将“ON”语句转移到 cake 以及如何将它们组合在一起?
  • ON 语句是JOIN 的一部分(在 DB2 中,它是必需的 - 不确定其他地方)。它正在指定您的加入标准。不幸的是,我没有使用 cakePHP 的经验(对不起,我错过了问题的那一部分),所以我无法帮助你。
【解决方案2】:

sort 和 type 在某些数据库中是保留字,可能会给您带来问题。

你试过了吗?

ORDER BY TYPE DESC, SORT ASC

【讨论】:

  • 不幸的是,这不会得到 OP 想要的,也不符合他想要的输出。
猜你喜欢
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2021-09-02
相关资源
最近更新 更多