@cjitkul33

Как в MySQL сделать хитрый join?

Есть table1, где поля
  1. username (varchar)
  2. dt (timestamp)
  3. value (varchar)

Есть table2, где поля
  1. username (varchar)
  2. dt (timestamp)
  3. value (varchar)

Как с наименьшими ресурсами (т.е. наиболее оптимально) выбрать value из table1 и дополнить их value из table2 где дата-время будет ближайшая к дате-времени из table1?

т.е. примерно так:
SELECT table1.username, table1.dt, table1.value, table2.value 
FROM table1, table2 
WHERE table1.username = table2.username and table1.dt БЛИЖАЙШАЯ_К table2.dt
  • Вопрос задан
  • 230 просмотров
Пригласить эксперта
Ответы на вопрос 1
@alpeg
SELECT `table1`.`username`, `table1`.`dt`, `table1`.`value`, (
	SELECT `table2`.`value`
	FROM `table2`
	WHERE `table1`.`username` = `table2`.`username`
	ORDER BY ABS(TIMESTAMPDIFF(SECOND, `table1`.`dt`,`table2`.`dt`)) ASC
	LIMIT 1
) AS `t2value`
FROM `table1`


Увы, эффективностью тут и не пахнет - EXPLAIN говорит, что в подзапросе будет "Using where; Using temporary; Using filesort" даже с индексами по полям `dt` - т.е. для каждого username из первой таблицы будет выполняться вычисление разницы времени с каждой записью с таким же username из таблицы 2.

Хотя, если на каждый username в таблице не по 10+ записей, то будет ещё терпимо.

И, ради бога, используйте вместо table1,table2 нормальный JOIN.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы