Mysql命令使用两列

时间:2010-04-06 09:05:37

标签: mysql

我正在使用一个包含Createdon和Lastmodifiedon字段的表,我必须首先显示基于createdon的新添加的记录,然后使用mysql显示lastmodifiedon记录。我尝试在查询结束时添加“ORDER BY Createdon,Lastmodifiedon desc”;但仅发生基于第一列的排序。任何人都可以帮助解决这个问题

感谢。

5 个答案:

答案 0 :(得分:2)

您按升序对Createdon进行排序,因此最后会显示更新的记录:

ORDER BY Createdon,Lastmodifiedon desc

你需要:

ORDER BY Createdon DESC, Lastmodifiedon DESC

答案 1 :(得分:1)

这是按日期列排序的一般问题。因为日期列通常包括精确到精细分辨率(有时是毫秒)的时间,所以排序顺序中的任何后续内容都会被有效忽略,因为在大多数应用程序中,在第一个日期获得两个相同项目的概率太低而无法看到它效果。

您需要做的是将初始日期截断为您满意的分辨率(例如,1天)并按排序,此时您将获得相同的项目ORDERing和你的第二个条款发挥作用。

我不太清楚MySQL知道这里的确切语法,但在SQL Server上我知道的最简单方法是

SELECT * FROM Table
ORDER BY FLOOR(CAST(CreatedOn AS Float)), LastModifiedOn DESC

哪个会给你1天的分辨率 - 原因是SQL Server在转换为浮动时的日期给出了代表当天的整数部分。如果您想要不同的分辨率,可以在ORDER BY语句中使用DATEADD和DATEDIFF,或者将日期转换为ASCII可排序格式的字符串(例如YYYYMMDD hhmmss)并在适当的位置截断。

答案 2 :(得分:0)

这种数据以什么方式表现奇怪?例如。你能提供一些例子,说明它的表现如何奇怪,你期望看到什么,你实际得到了什么?

你正在使用的ORDER BY是通常使用的,并且基本上工作的前提是它将按列表中的第一个排序,如果它找到两个相同的,它将按顺序排列第二个名单。一般的好例子是Firstname&姓。如果你按姓氏订购,你可能会得到两个'史密斯',此时,你可以通过名字订购,以便亚历克斯出现在谢里丹之前。

在您的示例中,您希望通过CreatedOn订购,然后是ModifiedOn。它将按创建日期排序,如果两个是在同一个日期时间(或仅仅是日期)创建的,那么它会按修改日期对它们进行排序。

解决方案?好吧,如果你保持数据不错,那么ModifiedOn是空的,那么你可以翻转排序并做类似的事情:ORDER BY ModifiedOn, CreatedOn。这确实留给你一个腌菜:你的ModifiedOn日期将需要从最旧的日期开始,因为空日期被认为是旧日期(类似于1970年1月1日)。我认为,正确地翻转它不仅仅是一个简单的顺序。因此,建议一个更好的答案可能需要一些数据来确保查询是正确的:)

答案 3 :(得分:0)

如果您的LastModifiedOn在新创建记录时的初始值为NULL,请执行以下操作:

ORDER BY 
     -- 1 displays first the newly created, 2 displays all modified in last order
     CASE WHEN LastModifiedOn IS NOT NULL THEN 2 ELSE 1 END,

     COALESCE(LastModifiedOn, CreatedON) DESC

答案 4 :(得分:0)

我在添加新记录时使用createdlastmodified约会相同的值,并在网格中显示时使用order by lastmodified desc。谢谢你的回复。