好吧,我有多个日期时间列,如date_created,last_login,last_updated等...我想将它们合并到一个列中,并显示最近的日期时间,以便我可以更轻松地跟踪active_users。MySQL将多个日期列合并为一个
我发现了一些使用CONCAT命令的建议,但是看起来只是将所有结果串在一起。
好吧,我有多个日期时间列,如date_created,last_login,last_updated等...我想将它们合并到一个列中,并显示最近的日期时间,以便我可以更轻松地跟踪active_users。MySQL将多个日期列合并为一个
我发现了一些使用CONCAT命令的建议,但是看起来只是将所有结果串在一起。
试试这个:
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条记录)。
如果值可以为空,并且您想要选择第一个非null
值,请使用COALESCE。 GREATEST
和LEAST
也选择
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
下面是我正在使用的屏幕截图http://imageshack.us/f/851/screenshot20110926at424.png/ COALESCE运算符略有改进,但即使not_null列中有数据对于每行都有不是最新的日期。 –
@Ryan Grush:使用'IFNULL'应该可以解决这个问题... – Marco
这看起来工作起初,但它只发现像行的1/10值。当我用'最少'取代'最大'时,它有1/5行。我试图诊断问题,但我没有太多运气。 –
当我删除几列时,它增加了包含数据的行数。也许包含某种形式的OR运算符? –
@Ryan Grush:我从来没有听说过这种行为:( – Marco