Я пытаюсь выбрать 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?
Благодарность
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
Вы должны увидеть значительную разницу при больших размерах стола.
Возможно, вы захотите использовать 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
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP — это широко используемый язык сценариев общего назначения с открытым исходным кодом, мультипарадигмальный, динамически типизированный и интерпретируемый, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.