2016-06-29 8 views
1

Я хочу объединить две таблицы в столбцах id, где идентификатор уникален в таблице1, но повторяется или может отсутствовать в таблице2. В таблице 2 я хочу использовать второй столбец (дата), чтобы выбрать наибольшую дату, которая меньше даты, соответствующей дате в строке таблицы1. Мне нужно, чтобы выбрать дополнительные столбцы из таблицы 2.Подзапрос MySQL с подзапросом с предложением WHERE, ретранслирующим внешний запрос

Запрос у меня есть:

SELECT * FROM `t1` LEFT JOIN 
(SELECT `t2`.`other_column`, MAX(`t2`.`date`) FROM `t2` GROUP BY `t2`.`id` WHERE `t2`.`date`<`t1`.`date`) 
ON `t1`.`id` = `t2`.`id` 

Проблема заключается в том, что вы не можете использовать t1 переменные в ИНЕКЕ из подзапроса в t2.

Спасибо,

+0

вы можете разместить выборочные данные и желаемый результат, включая вашу структуру таблицы –

ответ

2

Вы можете делать то, что вы хотите с коррелированных подзапросов в выберите пункт:

SELECT t1.* 
     (SELECT MAX(t2.date) 
     FROM t2 
     WHERE t2.id = t1.id AND t2.date < t1.date 
     ) as t2date 
FROM t1 ; 
+0

Ваш ответ пятно на за вопрос, я спросил, но я бы упростил его за то, что мне было нужно. Возможно ли выбрать в подзапросе несколько столбцов, а не только один? – Dom

+0

@Dom. , , Можете ли вы задать другой вопрос? –

2

EDIT: неправильное понимание вопроса. В этом случае вам потребуется подзапрос.

SELECT * FROM t1 
INNER JOIN 
(
    SELECT id, MAX(t2.date) AS `date` FROM t2 GROUP BY id 
) t3 ON (t3.id = t1.id AND t3.date < t1.date) 
+0

Это возвращает одну строку, а не одну строку на один идентификатор. –

+0

А, я неправильно понял вопрос. Позвольте мне еще раз посмотреть, можно ли его адаптировать с помощью аналогичного метода. – SArnab

+0

Редактирование не отвечает на мой вопрос. Подзапрос выбирает максимальную дату для каждого идентификатора, тогда предложение ON выбирает только строки, где абсолютная максимальная дата для id в t2 меньше даты в t1. То, что мне нужно, - это самая большая дата для t2, которая меньше даты в t1. – Dom

0

Оказывается, что в подзапросе была красная сельдь, и я мог делать все это без нее.

SELECT `t1`.*, `t2`.*, MAX(`t2`.`date`) FROM `t1` 
LEFT JOIN `t2` 
ON (`t1`.`id`=`t2`.`id` AND `t2`.`date`<`t1`.`date`) 
GROUP BY `t1`.`id` 
Смежные вопросы