2011-09-26 131 views
0

好吧,我有多個日期時間列,如date_created,last_login,last_updated等...我想將它們合併到一個列中,並顯示最近的日期時間,以便我可以更輕鬆地跟蹤active_users。MySQL將多個日期列合併爲一個

我發現了一些使用CONCAT命令的建議,但是看起來只是將所有結果串在一起。

回答

2

試試這個:

SELECT username, 
     GREATEST(date_created, last_login, last_updated) last_activity 
FROM your_table 
ORDER BY last_activity DESC 

編輯:

SELECT username, 
     GREATEST(
      IFNULL(date_created, 0), 
      IFNULL(last_login, 0), 
      IFNULL(last_updated, 0) 
     last_activity 
FROM your_table 
ORDER BY last_activity DESC 

再次編輯:
在你的數據庫的副本(有27.451記錄)我用:

SELECT id, 
     GREATEST(
      IFNULL(current_login_datetime, 0), 
      IFNULL(created_datetime, 0), 
      IFNULL(updated_datetime, 0)) 
     last_activity 
FROM users 
ORDER BY last_activity DESC 

獲取27.451條記錄!
爲了證明,運行此查詢:

SELECT COUNT(*) FROM 
(SELECT id, 
     GREATEST(
      IFNULL(current_login_datetime, 0), 
      IFNULL(created_datetime, 0), 
      IFNULL(updated_datetime, 0)) 
     last_activity 
FROM users 
ORDER BY last_activity DESC) der 

,並檢查返回的數字是一樣的查詢

SELECT COUNT(*) FROM users 

你的問題可以從限制在總返回或顯示的記錄導出。
例如,使用Navicat燈,您可以有1000條記錄(但總共可以讀取27.451條記錄)。

+0

這看起來工作起初,但它只發現像行的1/10值。當我用'最少'取代'最大'時,它有1/5行。我試圖診斷問題,但我沒有太多運氣。 –

+0

當我刪除幾列時,它增加了包含數據的行數。也許包含某種形式的OR運算符? –

+0

@Ryan Grush:我從來沒有聽說過這種行爲:( – Marco

0

如果值可以爲空,並且您想要選擇第一個非null值,請使用COALESCE。 GREATESTLEAST也選擇

SELECT 
    username 
    ,COALESCE(last_updated,last_login,date_created) AS not_null 
    ,GREATEST(date_created, last_login, last_updated) AS latest 
    ,LEAST(date_created, last_login, last_updated) AS first 
FROM table1 
ORDER BY last_activity DESC 

如果你想要更多的控制,你可以使用CASE WHEN語句:

SELECT 
    username 
    , CASE WHEN date_created > '2011-01-31' THEN date_created 
     WHEN last_login > '2011-01-31' THEN last_login 
     ELSE last_updated END as its_complicated 
..... 

如果你想要最新的,你有null值左右浮動,使用此查詢:

SELECT 
    username 
    ,GREATEST(IFNULL(date_created,0), IFNULL(last_login,0), IFNULL(last_updated,0)) AS latest 
FROM table1 
ORDER BY last_activity DESC 
+0

下面是我正在使用的屏幕截圖http://imageshack.us/f/851/screenshot20110926at424.png/ COALESCE運算符略有改進,但即使not_null列中有數據對於每行都有不是最新的日期。 –

+0

@Ryan Grush:使用'IFNULL'應該可以解決這個問題... – Marco