【问题标题】:How "ORDER BY" ordered if there are same value?如果有相同的值,“ORDER BY”如何排序?
【发布时间】:2020-06-03 05:03:30
【问题描述】:

假设有桌子:

name | score
A      100
B      98
C      99
D      99
E      99
F      98

并请求 sql = 'select * from table order by score desc'

我知道订单将是 100、99、99、99、98、98,但 99 和 98 中有几个值。

我正在使用 MyIsam 并希望确保 99 和 98 中的顺序不会更改,即使我删除了一些元素。 例如,如果订单是 C->D->E,我删除了 D,那么我希望是 C->E 但没有 E->C。 当订单价值相同时,它有什么逻辑吗?

【问题讨论】:

  • 无法保证具有相等值的行如何排序;就像如果查询中没有ORDER BY,则无法保证行的排序方式。保证它的唯一方法是使用二级排序,例如ORDER BY score DESC, name ASC
  • 即使删除行D,您也可以按列使用主键列以确保顺序。例如:在您的表中,如果主键中的名称列,那么您的选择查询将为select * from table order by score desc,name asc

标签: mysql sql sql-order-by myisam


【解决方案1】:

SQLite 以未指定的顺序将行存储在表中。这意味着表中的行可能会也可能不会按照它们插入的顺序。

如果您使用 SELECT 语句从表中查询数据,则结果集中的行顺序未指定。要对结果集进行排序,请在 SELECT 语句中添加 ORDER BY 子句,如下所示:

SELECT
   select_list
FROM
   table
ORDER BY
    column_1 ASC,
    column_2 DESC;

我希望这个link 可以帮助你。

【讨论】:

  • 这个问题没有 SQLite 标记。
【解决方案2】:
SELECT * FROM table ORDER BY score DESC 

以上查询仅按分数对数据进行排序。 如果您想按您提到的另一个字段对数据进行排序,您还可以将该字段添加到查询中,如下所示。您提到要按名称按加入顺序 (C > D > E) 进行排序。所以我使用了 ORDER BY ASC。下面的查询将为您提供您请求的输出。

SELECT * FROM table ORDER BY score DESC,name ASC

【讨论】:

    【解决方案3】:

    SQL 表代表无序 集合。因此,当order by 键具有相同的值时,没有“默认”排序。

    从技术上讲,这意味着 SQL 中的排序是不稳定的。解决方法是添加一个或多个附加键,以便每个组合都是唯一的。

    对于您的示例数据,这大概可以使用name 处理:

    order by score desc, name
    

    如果可用,您还可以使用任何其他列来唯一标识每一行。这些键score之后。

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多