2010-04-06 81 views
1

我正在使用具有Createdon和Lastmodifiedon字段的表,我必須首先顯示基於createdon的新添加的記錄,然後使用mysql顯示lastmodifiedon記錄。我已經嘗試在查詢結尾處添加「ORDER BY Createdon,Lastmodifiedon desc」;但是僅基於第一列進行排序。任何人請在這個問題上的幫助通過使用兩列的Mysql訂單

謝謝。

+0

可能的重複http://stackoverflow.com/questions/514943/php-mysql-order-by-two-columns,http://stackoverflow.com/questions/2051162/sql-multiple-column-ordering。另請參閱http://stackoverflow.com/questions/2099923/how-do-i-order-by-multiple-columns-in-a-select-query – outis 2010-04-06 09:20:29

+0

您能否提供一些數據示例以及您希望如何出現以及它是如何出現的? – Amadiere 2010-04-06 09:21:29

回答

0

這種數據表現得很奇怪嗎?例如。你能否提供一些例子,說明它的表現很奇怪,你期望看到什麼,以及你實際得到了什麼?

您正在使用的ORDER BY是通常使用的,基本上它的工作原理是它將按列表中的第一個順序排列,如果發現兩個相同,它將按列表中的第二個排序。正常的好例子是名字&姓氏。如果你按姓氏排序,你可能會得到兩個'史密斯',在這一點上,你可以用名字命令,以便亞歷克斯出現在謝里登之前。

在你的例子中,你想通過CreatedOn訂購,然後是ModifiedOn。它會按創建的日期排序,如果兩個日期時間(或日期)創建,則它將按修改日期排序。

解決方案?那麼,如果你保持你的數據很好,所以ModifiedOn是空的,那麼你可以翻轉排序並執行如下操作:ORDER BY ModifiedOn, CreatedOn。這確實給你留下了一個泡菜,但你的ModifiedOn日期將需要從最舊的日期開始,因爲空的日期被認爲是一箇舊日期(類似1/1/1970)。正確地翻轉這一點不僅僅是我認爲的一個簡單的順序。爲了提出一個更好的答案將因此可能需要一些數據,以確保查詢正確:)

3

您按升序排序Createdon,所以新的記錄也會出現在最後:

ORDER BY Createdon,Lastmodifiedon desc 

你需要:

ORDER BY Createdon DESC, Lastmodifiedon DESC 
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)並在適當的位置截斷。

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 
0

我以前createdlastmodified日期相同的值添加新記錄時和使用order by lastmodified desc在網格中顯示當。感謝您的回覆。