繁体   English   中英

如何选择Max(id)与Mysql中两个时间戳之间的差异优于五分钟?

[英]How to select Max(id) with the difference between two timestamp superior to five minute in Mysql?

我正在尝试在mysql的两个时间戳之间选择5分钟之差的Max('id')。

我的时间戳字段已sent

我做了

SELECT Max('id') FROM `mytable` WHERE TIMESTAMPDIFF(MINUTE, `sent`, NOW()) > 5

但这没有用。 它给我发送了空结果

这是我的表结构

CREATE TABLE IF NOT EXISTS `mytable` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `from_id` int(10) unsigned NOT NULL,
  `to_id` int(10) unsigned NOT NULL,
  `message` text NOT NULL,
  `sent` int(10) unsigned NOT NULL DEFAULT '0',
  `read_statu` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `is_deleted` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `to` (`to_id`),
  KEY `from` (`from_id`),
  KEY `direction` (`is_deleted`),
  KEY `read` (`read_statu`),
  KEY `sent` (`sent`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=201 ;

INSERT INTO `mytable` (`id`, `from_id`, `to_id`, `message`, `sent`, `read_statu`, `is_deleted`) VALUES
(1, 1, 2, 'Juste un test pour moi meme', 1425729597, 1, 0),
(2, 2, 1, 'Hello', 1425729612, 1, 0),
(3, 2, 1, ' <3  (L)  :prayer:  :tkh:  :heart:  :-$ ', 1425729922, 1, 0),
(4, 2, 1, ' <3  (L)  :prayer:  :tkh:  :heart:  :-$ ', 1425729927, 1, 0),
(5, 1, 2, 'Ok', 1426010868, 0, 0);

请如何选择Max(id)与Mysql中两个时间戳之间的差异优于5分钟?

谢谢

id应该用反引号而不是单引号引起来

SELECT Max(`id`) FROM `mytable` ...

通过在那里使用单引号,MySQL使用文字字符串'id'代替列id

另外,您需要了解TIMESTAMPDIFF不接受UNIX时间戳作为参数,而是接受有效的MySQL日期时间表达式。 给定两个日期时间表达式值,此函数用于返回类似时间戳的间隔值。

IMO,通过将sent的数据存储为日期时间字段而不是Unix时间戳,可以极大地帮助自己。 如果您需要在现场进行任何计算/过滤等操作,Unix时间戳通常在MySQL表中是一个糟糕的设计决策。

假设您将更改sent到datetime字段,则查询可能如下所示:

SELECT MAX(`id`)
FROM `myTable`
WHERE `sent` > DATESUB(NOW(), INTERVAL 5 MINUTE)

假设您要保留Unix时间戳字段格式,查询可能如下所示:

SELECT MAX(`id`)
FROM `myTable`
WHERE `sent` > UNIXTIMESTAMP(DATESUB(NOW(), INTERVAL 5 MINUTE))

您会看到您需要进行额外的转换才能与UNIX时间戳一起使用。

在此还要注意WHERE子句的格式。 我没有像在查询中那样使用被过滤的字段作为计算的一部分。 您的方法将不允许对查询sent使用索引。 通过将所有时间计算都保留在比较的一侧,从本质上讲,我们能够对整个查询进行一次datetime计算,然后使用sent索引将每个行与该值进行比较。

要查看查询速度的这种差异,请运行上面给出的第二个查询(使用您当前使用的sent时间戳),然后与下面的查询进行比较,这与您当前的方法类似:

SELECT MAX(`id`)
FROM `myTable`
WHERE TIMESTAMPDIFF(MINUTE, FROM_UNIXTIME(`sent`), NOW()) > 5

您应该在较大的表大小上看到明显的不同。

您可能要使用Max(id)和“ sent”代替Max('id')和“'sent'”

编辑:^ ---这是部分错误的,使用`id`和`sent`是有效的,但是'id'和'sent'是无效的

像这样:

SELECT Max(id) FROM `mytable` WHERE TIMESTAMPDIFF(MINUTE, sent, NOW()) > 5

编辑:问题是您已将“发送”存储为整数,为了与TIMESTAMPDIFF一起使用,您必须将其转换为DATE_TIME格式。 这是您可以执行的操作:

TIMESTAMPDIFF(MINUTE,FROM_UNIXTIME(sent),NOW())

最终结果:

 SELECT Max(id) FROM `mytable` WHERE TIMESTAMPDIFF(MINUTE,FROM_UNIXTIME(sent),NOW()) > 5 

一些额外的阅读: 在MySQL查询中将时间戳转换为日期

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM