Я пытаюсь выбрать Max ('id') с разницей в 5 минут между двумя отметками времени в mysql.

Мое поле отметки времени: 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?

Благодарность

0
Ferdine Faithfull 10 Мар 2015 в 20:19

2 ответа

Лучший ответ

id следует экранировать обратными кавычками, а не одинарными кавычками.

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

Используя одинарные кавычки, MySQL использовал буквальную строку 'id' вместо столбца id.

Кроме того, вы должны понимать, что TIMESTAMPDIFF не принимает в качестве аргументов метки времени UNIX, а скорее допустимые выражения даты и времени MySQL. Эта функция используется для возврата значения интервала, подобного метке времени, для двух значений выражения даты и времени.

IMO, вы бы очень помогли себе, сохранив sent как поле даты и времени, а не метку времени Unix. Временные метки Unix обычно являются плохим дизайнерским решением в таблицах MySQL, если вам когда-либо понадобится выполнять какие-либо вычисления / фильтрацию и т. Д. В полевых условиях.

Предположим, вы измените sent на поле даты и времени, ваш запрос может выглядеть следующим образом:

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

Вы должны увидеть значительную разницу при больших размерах стола.

2
Mike Brant 10 Мар 2015 в 19:32

Возможно, вы захотите использовать Max (id) и «отправлено» вместо Max ('id') и «отправлено»

Изменить: ^ --- Это частично неверно, допустимо использовать `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

1
Community 23 Май 2017 в 12:28