Mysql:使用最大的时间戳排序

标签 mysql sql sql-order-by

我正在尝试使用 2 个表之间的最大时间戳对我的记录进行排序。 现在我使用以下 order 条件:

ORDER BY 
    GREATEST(
        IFNULL(tableA.create_time, 0), 
        IFNULL(tableB.create_time, 0)
    ) 
DESC

但是执行查询时,结果根本没有排序。我错过了什么?

(我正在使用 IFNULL 因为时间戳也可以是 NULL)

编辑

正如我在评论中所说,当我选择最大的以查看它的值(value)时,结果我得到“2014-0”而不是“2014-08-14 17:04:39”

这是一个 Sql fiddle甚至是 simpler one with the same problem

最佳答案

奇怪的是,IFNULL 似乎在处理 TIMESTAMP 和 INT 时遇到了麻烦,看起来下面的方法可以解决这个问题:

ORDER BY 
  GREATEST(
    COALESCE(tableA.create_time, 0), 
    COALESCE(tableB.create_time, 0)
  ) 
DESC

似乎返回了正确的结果。无论如何,我更喜欢 COALESCE 而不是 IFNULL,因为它更灵活且符合 ANSI 标准。

更新

在进一步调查中.. 这太奇怪了,你描述的问题只发生在 5.5.32(MySQL fiddle 选项)并且需要 GREATEST 或 LEAST 函数,两个不同的 TIMESTAMPS,IFNULL round one with INT replacement, JOIN 到适当的表(不是子选择)和 ORDER BY 以显示。疯狂的蛋糕!哦,表必须是 InnoDB,为什么不是!?

我发现重现此问题的最小值是:

  CREATE TABLE tablea (
    create_time timestamp
  ) ENGINE=InnoDB;

  INSERT INTO `tablea` (create_time) VALUES (NOW());

  SELECT GREATEST(t1.create_time,IFNULL(NOW(),0)) 
    FROM tablea t1
    JOIN tablea t2
ORDER BY 1;

关于Mysql:使用最大的时间戳排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25316651/

相关文章:

mysql - 如何使用 Slick 在 VARCHAR 列中使用 UUID?

php - 检查数据库中是否已存在电子邮件

Mysql Order BY 速度

SQLite:使用 ROWID 代替时间戳

mongodb - Mongo按数组长度排序

php - MySQL 对两列进行选择和排序

python - 将我的项目管道更改为 if 和 elif 语句后,Spider 未返回所有结果

mysql - 查询仅选择每 5 分钟的时间戳

mysql - 查找具有多个关系的实体

SQL查询计算同一个表的列之间的关系