Самый эффективный способ найти самое близкое целое число в MySQL?

, Если Вы просто используете его для grep, можно использовать grep -v hede для получения всех строк, которые не содержат Эде.

ETA, О, перечитывая вопрос, grep -v, вероятно, что Вы подразумевали "под опциями инструментов".

6
задан heyitsme 20 August 2009 в 02:26
поделиться

3 ответа

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

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

В идеале вместо > и < вы должны использовать > = и <= и исключить ссылочная запись с использованием ее первичного идентификатора для учета записей с одной и той же меткой времени.

10
ответ дан 9 December 2019 в 20:46
поделиться

Как сказал Эван, у вас все в порядке. Я бы порекомендовал указать индекс для этого поля временной метки, чтобы MySQL мог сканировать меньший индекс, а не всю таблицу. Кроме того, я бы попробовал «упаковать», чтобы увидеть, может ли индекс ускорить работу:

SELECT *, ABS(time - 1250710000) AS time_dist FROM table 
WHERE time between(1250610000,1250810000)
ORDER BY time_dist ASC LIMIT 1

Вышеуказанные ограничения для запроса составляют примерно +/- 1 день. Вам нужно будет выполнить несколько тестов, чтобы увидеть, работает ли дополнительное сканирование индекса (предложение where) быстрее, чем вычисление ABS () для всех записей в таблице.

1
ответ дан 9 December 2019 в 20:46
поделиться

Было бы более эффективным выбрать минимальное время, которое больше, и максимальное? время, которое меньше, чем просто абс у этих двух. Это должно избежать необходимости работать на всю таблицу.

ВЫБРАТЬ МАКС. (время) КАК предыдущий ГДЕ время <1250710000;

ВЫБРАТЬ МИН (время) КАК следующее ГДЕ время> 1250710000;

ВЫБРАТЬ МИН (АБС (предыдущее), АБС (следующее));

Мой SQL недостаточно силен, чтобы объединить их в один, и накладные расходы на три запросы могут убить любую экономию, но это возможно.

1
ответ дан 9 December 2019 в 20:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: