Предполагая, что time
проиндексирован, вы можете получить запись next почти бесплатно:
SELECT * FROM table WHERE time > 1250710000 ORDER BY time LIMIT 1
И если я не ошибаюсь, то же самое должно относиться к предыдущей записи, MySQL будет просто читать индекс в обратном порядке. Используйте СОЮЗ из двух, упорядочите их по дате и времени! Результат будет выглядеть так
SELECT *
FROM
(
(SELECT *, ABS(time - 1250710000) AS time_diff FROM table WHERE time > 1250710000 ORDER BY time ASC LIMIT 1)
UNION ALL
(SELECT *, ABS(time - 1250710000) AS time_diff FROM table WHERE time < 1250710000 ORDER BY time DESC LIMIT 1)
) AS tmp
ORDER BY time_diff
LIMIT 1
В идеале вместо >
и <
следует использовать >=
и <=
и исключать опорную запись, используя ее первичный идентификатор, для учета записей, использующих одну и ту же метку времени.