Приветствую. Предположим, что я хочу из таблицы
messages получить данные сообщения, которое на сутки (или более) старше текущего (для текущего у меня есть его id).
Пробный запрос:
SELECT * FROM messages WHERE id =
(SELECT MAX(id) FROM messages WHERE
id < 40000 AND dt <= DATE_SUB('2016-04-18 23:23:23', INTERVAL 24 HOUR));
Функционирует быстро. Есть индекс на поле
dt, хотя не уверен, что он используется в
DATE_SUB()
А вот при использовании переменной - намертво глохнет:
SET @myid = 40000;
(SELECT MAX(id) FROM messages WHERE
id < @myid AND dt <= DATE_SUB('2016-04-18 23:23:23', INTERVAL 24 HOUR));
Почему?! В чем особенность запроса?
В рабочем коде я использую хранимую процедуру, в которую передаётся
myid. И, опять-таки, работает быстро.
DROP PROCEDURE IF EXISTS `TEST`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `TEST`(IN myid INT)
BEGIN
(SELECT MAX(id) FROM messages WHERE
id < myid AND dt <= DATE_SUB('2016-04-18 23:23:23', INTERVAL 24 HOUR));
END$$
DELIMITER ;
CALL TEST(40000);