簡體   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