好的,所以我有多个日期时间列,例如 date_created、last_login、last_updated 等...我想将它们合并到一个显示最新日期时间的列中,以便我可以更轻松地跟踪 active_users。
我找到了一些使用 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 light 你可以有 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