|
|
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
Есть таблица с полем 'ut' типа int, в нем время в формате unixtime. Есть заданное пользователем значение unixtime, нужно найти в таблице запись, имеющую значение поля 'ut' наиболее близкое к заданному значению или равное ему. Пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Пользовательское значение: 1455606390 Должно найтись: запись с id=4 и ut=1455606393 Дополнительные условия: Записей много - несколько миллионов Поле ut вполне может быть 0 Дополнительные индексы делать нельзя Возможный вариант - все аналогично, только поле 'ut' имеет тип varchar. Вторая, более сложная задача. Две похожие таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Сами данные аналогичны первой задаче. В первой миллионы записей, во второй - тысячи. Нужно "раскидать" записи из таблицы test2 по таблице test1, т.е. сделать что-то вроде: "UPDATE test1 SET test1.p2 = test2.p2 WHERE test1.ut примерно равно test2.ut" Это вообще возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 16:40 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
Задача одна и та же. Подход к решению: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Из двух записей, надеюсь, одну выбрать сумеешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 17:43 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
AkinaИз двух записей, надеюсь, одну выбрать сумеешь? Нет, не сумею, к сожалению. Какая из них будет ближайшая к нужному значению? И как-таки подобным образом решить второй вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 18:00 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
Да и собственно это фактически два отдельных запроса получилось. Это я и на том же пхп могу сделать, не прибегая к union... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 18:02 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 18:11 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
SharuPoNemnogu Код: sql 1. Супер! Работает как надо. Никогда бы не догадался. Спасибо! Еще бы вторую задачу решить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 18:15 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
AkinaДа одна это задача, одна! только в первом варианте заданное время - константа, а во втором - значения поля записи второй таблицы. Еще кстати, момент - ваш запрос с двумя селектами и union, который при этом не решает задачу, а лишь сужает выборку до двух значений - выполняется 1,32 секунды, а второй предложенный запрос отрабатывает при тех же условиях за 0,67. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 19:08 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. Как-то так получается? Вроде бы даже результат устраивает. Но это же селект для каждой записи, которую нужно апдейтить... Наверное это неправильно? Можно что-то улучшить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 19:41 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
antonv Код: sql 1. Как-то так получается? Вроде бы даже результат устраивает. Но это же селект для каждой записи, которую нужно апдейтить... Наверное это неправильно? Можно что-то улучшить? 2 000 000 в test1 100 000 в test2 Результат выполнения 10 минут. Это совсем не результат :-( Мало того, не пойму, как апдейтить два, три и т.д. полей сразу - ведь не так же: Код: sql 1. 2. 3. 4. 5. Эдак будет по 10 минут на каждый столбец... Как оптимизировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 22:00 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
antonvКак оптимизировать?Вернуться к варианту с UNION. Он может использовать индекс, а order by abs(ut - unixtime) - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 23:48 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
miksoftantonvКак оптимизировать?Вернуться к варианту с UNION. Он может использовать индекс, а order by abs(ut - unixtime) - нет. Индекса у используемых полей нет и добавить возможности тоже нет. Я писал об этом в начале. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 00:09 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
antonvmiksoftпропущено... Вернуться к варианту с UNION. Он может использовать индекс, а order by abs(ut - unixtime) - нет. Индекса у используемых полей нет и добавить возможности тоже нет. Я писал об этом в начале.Тогда оставляйте order by abs(ut - unixtime). Это будет хотя бы одно полное сканирование таблицы, а не два. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 01:03 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
antonvПродемонстрированный вами подход, ни с одной из возможных точек зрения не может служить даже толчком для "подумать", т.к. уводит далеко в сторону от нормальных оптимизированных решений. Подход "тупо в лоб, перебором". Собственно, все остальное, что вы написали - из той же серии. У Акины как раз правильный подход... но только для правильных таблиц, с необходимыми индексами. В вашей чудо-таблице их нет, и только поэтому вариант ШПН работает лучше, т.к. делает только 1 фулскан(то самое "тупо в лоб, перебором", о котором вы так пренебрежительно отзываетесь), в то время как по варианту Акины приходится выполнять два. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 07:10 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
Кстати, эти "неправильные чудо-таблицы", как вы выразились, генерят некие достаточно старые девайсы, доступа к которым нет и не будет. Да и к самой базе доступ изрядно урезан. А работать с этим надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 15:41 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
Размышления предполагались такие: Есть запрос из двух подзапросов c UNION. Он даёт две записи. У одной время раньше заданного, у другой позже. Надо выбрать ту, которая ближе. Ближе та, у которой меньше разница. Но у одной записи она положительна, у другой отрицательна. Значит, для сравнения надо взять её абсолютное значение. Это делает функция ABS. А если так - то зачем два запроса и две записи, когда можно в одном посчитать все разницы, и выбрать сразу одну запись, у которой это самое ABS(разница) самое маленькое? И получаем то, что написАл SharuPoNemnogu . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 15:55 |
|
||
|
Как найти ближайшую запись?
|
|||
|---|---|---|---|
|
#18+
Да, кстати - свою задачу я успешно решил, всем до свидания и спасибо за участие (даже Akina) :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2016, 16:47 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=110&tid=1832138]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 205ms |
| total: | 345ms |

| 0 / 0 |
