Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

выборка ближайших полей

271
25 апреля 2007 года
MrXaK
721 / / 31.12.2002
есть 2 таблицы (t1, t2) в бд (mysql)... в одной таблице есть поле names, в котором содержатся 2 строки через разделитель \n, есть поле addtime, в нём число... есть вторая таблица... в ней тоже есть поля names и addtime, в поле names только одна строка...
надо выбрать данные, чтобы к обоим строкам t1.names соответствовали поля t2.names и t1.addtime и t2.addtime были ближайщими... в t1.names может лежать как 2 строки через разделитель, так и одна... это можно реализовать одним запросом к бд?
239
25 апреля 2007 года
Dolonet
1.7K / / 20.05.2000
Не очень понятно, сколько t2-записей нужно вернуть - по количеству строк в t1.names?
Вообще, следует пользоваться в данном случае директивой MySQL "LIKE".

От себя хочу заметить, что структура БД реализована плохо, если возникают такие задачи. Возможно, Вам следует задуматься над переформированием структуры БД.
271
25 апреля 2007 года
MrXaK
721 / / 31.12.2002
Цитата:

Не очень понятно, сколько t2-записей нужно вернуть - по количеству строк в t1.names?
Вообще, следует пользоваться в данном случае директивой MySQL "LIKE".

От себя хочу заметить, что структура БД реализована плохо, если возникают такие задачи. Возможно, Вам следует задуматься над переформированием структуры БД.


да, по количеству строк t1.names
бд можно перестроить, чтобы было например t1.name1 и t2.name2
LIKE не представляю как использовать... в полях addtime число, когда запись была добавлена в бд, хранится там пхпшное time()... по сути надо объединить значения, которые было добавлены приблизительно в одно время... объединить таблицы в одну не представляется возможным...

239
25 апреля 2007 года
Dolonet
1.7K / / 20.05.2000
По большому счету, если поля действительно только одно или два будет, то можно name1 и name2 поставить. Это избавит Вас от возможных ошибок и лишних проверок. А одним запросом можно примерно так: (пишу от руки, поэтому не гарантирую работоспособность, главное - принцип)
 
Код:
(SELECT t2.name AS aaa FROM t2 INNER JOIN t1 ON t2.name REGEXP CONCAT("^",t1.name,"\n") ORDER BY ABS(t1.addtime-t2.addtime) ASC LIMIT 0,1)
UNION
(SELECT t2.name AS aaa FROM t2 INNER JOIN t1 ON t2.name REGEXP CONCAT("\n",t1.name,"$") ORDER BY ABS(t1.addtime-t2.addtime) ASC LIMIT 0,1)
271
25 апреля 2007 года
MrXaK
721 / / 31.12.2002
во) спасибо)
напрочь забыл про ORDER BY ABS(t1.addtime-t2.addtime) =))
239
25 апреля 2007 года
Dolonet
1.7K / / 20.05.2000
В Вашем случае ABS() не нужен, достаточно разок расставить большее меньше меньшего. Просто я ж не знаю что у вас там раньше :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог