【问题标题】:Showing error for order by显示订单错误
【发布时间】:2017-08-28 06:43:32
【问题描述】:

我创建了表格并插入了一些值。

create table deposit1_groupc_tja05
(
  Account_id number(25),
  Account_type varchar(25),
  Balance number(9,2) not null,
  Transaction_amount number(9,2) not null,
  Transaction_Date varchar(50),
  Transaction_type varchar(25)
) 

现在我需要通过Transaction_Date 订购吗? 我该如何改变它?

【问题讨论】:

  • SELECT * FROM deposit1_groupc_tja05 ORDER BY Transaction_Date
  • RDBMS 中的行表示无序集。如果你想要一个订单,你必须在查询数据集时包含一个订单。顺便说一句,以您的方式命名的表通常表现出设计不佳的症状
  • 没有。没有选择。这个概念毫无意义
  • @Pravin : 为什么将Transaction_Date 存储为varchar
  • 向我们展示这些文本交易日期的样子。顺便说一句,停止将日期存储为文本。

标签: mysql sql


【解决方案1】:

在 MySQL 的默认存储引擎 InnoDB 中,表始终按其主键(即聚集索引)排序。

您在显示的示例中没有声明主键,因此 InnoDB 将按不可见的主键排序,因此存储顺序将是您插入行的顺序。

您可以使用 ALTER TABLE 来声明主键。这将按主键重新排序存储。如果您使用 Transaction_Date(一个 varchar),它将按字母顺序排序,而不是按日期排序。如果您希望按日期排序,则应使用 DATE 数据类型。

如果您希望给定的查询结果集按主键以外的另一列排序,则只需使用ORDER BY 子句。您可以获得与表的存储顺序不同的结果集。

如果您不在查询中使用ORDER BY 子句,则结果集通常没有保证顺序(并且根据 SQL 标准),这取决于实现。在 InnoDB 的情况下,仍然不能保证它会一直以这种方式工作,但实际上,在当前版本中,没有 ORDER BY 的查询会按照它从索引中读取它们的顺序返回行(可能是聚集索引 /主键)。

【讨论】:

  • 实现不是抽象。 OP 没有说他们想要订购 storage。并且不能保证没有 ORDER BY 的查询的结果集是任何顺序的,无论存储顺序如何。
  • @philipxy,确实,OP 的问题很模糊,我想我们不会从他们那里得到任何澄清。
【解决方案2】:

如果您无法将 Transaction_Date 列更改为日期时间,则需要在查询中转换日期,如下所示:

SELECT * FROM deposit1_groupc_tga05
ORDER BY STR_TO_DATE(Transaction_Date, '%c/%e/%Y %H:%i')

或者根据插入日期的格式,需要更改格式字符串。

【讨论】:

    【解决方案3】:

    无法按照您描述的方式对表格进行排序。

    如果您想按顺序选择数据,请使用以下

    SELECT * 
    FROM deposit1_groupc_tga05
    ORDER BY Transaction_Date
    

    您还应该使用 Transaction_Date 作为日期时间来创建表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-02
      • 2014-06-15
      • 2019-09-13
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      相关资源
      最近更新 更多