【问题标题】:Mysql order items by the newest of 2 datesMysql 按最新的 2 个日期订购商品
【发布时间】:2010-07-16 12:46:48
【问题描述】:

我有一个包含 2 个日期的表 - ADDDATE 和 UPDATEDATE。
添加项目时,ADDDATE 为当前日期,UPDATEDATE 为 0000-00-00。

我需要ORDER BY SQL 命令并获得这两个命令中的最佳日期。
例如,如果 ADD=12/1/2010 和 UPDATE=30/6/2010, UPDATE DATE 最好(最新)。

有什么建议吗?

【问题讨论】:

    标签: mysql sql-order-by


    【解决方案1】:

    使用GREATEST 查找最新日期:

    ORDER BY GREATEST(UPDATEDATE, ADDDATE)
    

    【讨论】:

    • 只是给遇到我问题的人的提示,如果您需要比较时间戳和 MySQL 日期,您也可以 ORDER BY GREATEST(ADDDATE, FROM_UNIXTIME( UPDATEDATE) )
    【解决方案2】:
     ORDER BY IF(UPDATEDATE > ADDDATE, UPDATEDATE, ADDDATE)
    

    【讨论】:

    • 当 NULL 可能并且您希望返回非空值时,这比 GREATEST 效果更好。
    • 你拯救了我的一天
    【解决方案3】:

    如果您想让您的数据库具有可扩展性,最好的方法是添加一个新列 LATESTDATE 以及一个插入/更新触发器,该触发器使用例如 @987654321 将其设置为两个候选字段中的最新字段@。

    随着表变大,在您的选择上运行每行函数会很快变慢。如果您希望性能随着表的增长而保持可用,那么这种技巧很常见。

    它在技术上违反了 3NF,因为它重复了其中一个日期,但出于性能原因,违反是可以的,并且您仍然保持 ACID 属性,因为触发器指示列保持一致。

    我不知道 MySQL 触发器语法,但我会做类似的事情:

    • 创建新列,将其设置为合适的默认值。
    • 创建插入/更新触发器以确保反映更改。
    • 使用update TBL set ADDDATE = ADDDATE 之类的查询触摸所有行,以便为所有当前行触发触发器。

    此解决方案的优势在于它将计算成本转移到数据更改的时间, 而不是每次查询数据库时。这分摊了所有读取的成本,从而提高了效率(除非您是那些非常罕见的野兽之一,表的写入频率高于读取频率)。

    请记住,如果您的桌子相对较小,这可能没有必要 - 我在桌子真的很大的环境中工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2019-05-29
      • 2015-05-12
      相关资源
      最近更新 更多