"INER JOIN on time<time_x LIMIT 1"

botan

Новичок
"INER JOIN on time<time_x LIMIT 1"

Есть 2 таблицы у которых есть поле типа date.
Надо к первой "приджойнить" вторую по следующему условию:
"Выбрать первую дату из таблицы 2 которая идёт после даты из таблицы 1"
Например
1 таблица
1 2005-01-01
2 2005-02-01
3 2005-03-01
2 Таблица
10 2004-12-31
20 2005-01-02
30 2005-01-03
40 2005-05-05
Хотелось бы иметь:
1 10 2005-01-01 2004-12-31
2 30 2005-02-01 2005-01-03
3 30 2550-03-01 2005-01-03

Ценность представляют именно связи
1 - 10
2 - 30
3 - 30

Хелп.
Хотелось бы в один запрос.
 

fixxxer

К.О.
Партнер клуба
В один запрос ничего лучше, чем select t.id,t1.id,t.d,t1.d from t inner join t1 on (t.d < t1.d) order by (t1.d-t.d), вряд ли можно придумать.

Поставь mysql 4.1 ;)
 

botan

Новичок
А что даст 4.1. ?
Такой запрос не канает, он ведь дохрена записей к каждой t из t1 притащит ибо (t.d < t1.d) для "больших дат t.d" будет слишком часто удовлетворяться.
К тому же если в таблицах много записей - это смерть :(

-~{}~ 04.05.05 17:00:

З.Ы.
4.1.11 уже :)
 

fixxxer

К.О.
Партнер клуба
4.1 даст вложенные селекты. Это, конечно, тоже не быстро...

Кстати, еще дикий вариант.
select *, 1 as tid from t union select *, 2 as tid from t1 order by d

при этом берем только пары строк с tid 1 и 2 последовательно. =)
 

botan

Новичок
мне крайне желательно получить именно 1 строчку :)
Ну т.е. надо что бы если в первой таблице есть N записей то и в результирующей тоже было N записей.
т.е. order by smth limit 1 я использовать не могу
 

fixxxer

К.О.
Партнер клуба
ну, что-то вроде select t.id, t.d, t1.id, t1.d from t, t1 where t1.id in (select id from t1 where t1.d > t.d order by t1.d limit 1)
 

botan

Новичок
Я видимо в понедельник родился :)
t1.id - как таковой не существует - индекс раскидан на 3 поля :(
Чую счас напишу что-то страшное :)

-~{}~ 04.05.05 18:34:

Кстати, спасибо большое. Вложеные селекты спасли отца русской демократии 0,08 секунд всего :)
 
Сверху