2011-09-26 133 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