Единый запрос для получения данных из 3 отдельных таблиц на основе предоставленной временной метки

#mysql

#mysql

Вопрос:

Я работаю с тремя таблицами, которые можно резюмировать следующим образом:

Таблица1 (pid, созданные данные, ссылка 1) Таблица2 (pid, созданные данные) Таблица3 (ссылка 1, созданные данные)

Созданное поле представляет собой временную метку UNIX, а поле данных имеет одинаковый формат в каждой таблице.

Я хочу получить данные во всех 3 таблицах таким образом, чтобы Table1.pid = Table2.pid И Table1.link1 = Table3.link1 И created были меньше и ближе всего к заданному значению временной метки.

Итак, в качестве примера, допустим, я указываю дату 7 мая 2011 года, 13: 00 вечера. Я бы хотел, чтобы запись данных из каждой таблицы была создана последней до этой даты-времени.

Теперь мне удалось сделать это в довольно уродливом одиночном запросе, включающем подзапросы (используя либо ВНУТРЕННИЕ соединения, либо объединения), но мне интересно, можно ли это сделать без подзапросов в одном запросе? Спасибо за любые предложения.

Ответ №1:

Очевидно, что я на самом деле не запускал запрос, но, похоже, он сделает все, что вам нужно, если я правильно понимаю ваш вопрос.

t1.pid и t2.pid совпадают, t1.link1 и t3.link1 совпадают, и ни один из .created не превышает вашего времени, и вам нужна строка, ближайшая к дате.

SELECT t1.data, t2.data, t3.data FROM Table1 t1, Table2 t2, Table3 t3 WHERE t1.pid = t2.pid AND t1.link1 = t3.link1 AND GREATEST(t1.created,t2.created,t3.created) < 'your-formatted-time' ORDER BY GREATEST(t1.created,t2.created,t3.created) DESC;

Комментарии:

1. Спасибо за ответ, Джон, но не похоже, что ваш запрос гарантирует получение самых последних записей из каждой таблицы. Предложение ORDER BY упорядочивает результаты по наибольшей дате из 3 таблиц, а не по наибольшей дате в каждой таблице. Мне нужны самые последние данные из каждой таблицы (которые старше, чем предоставленная временная метка).

2. Извините за это, по какой-то причине я прочитал ваш «Table1.pid = Table2.pid» как «Table1.created = Table2.created».

3. SELECT t1.data, t2.data, t3.data FROM t1, t2, t3 WHERE t1.pid = t2.pid AND t1.link1 = t3.link1 AND GREATEST(t1.created, t2.created, t3.created) <= provided_timestamp ORDER BY t1.created DESC, t2.created DESC, t3.created DESC LIMIT 1 Я полагаю, что должно сработать несколько order by. Спасибо за отзыв, Джон.

4. Просто чтобы прояснить, что вы ищете. Вы упоминаете, что вам нужны самые последние данные из каждой таблицы, которая старше временной метки, но также упоминаете, что вам нужны t1.pid = t2.pid и t1.link1 = t3.link1. Не могли бы вы либо уточнить немного больше, каков ваш ожидаемый результат, либо просто показать «довольно уродливый одиночный запрос», который вы используете?

5. Если вы используете запрос в своем комментарии, вы получите 1 результат (предел 1), который соответствует дате t1.created, поскольку это ваш первый заказ. Если вы выполните то же самое ‘GREATEST’, вы получите 1 строку, соответствующую созданной наибольшей. Ваши дополнительные инструкции ORDER действительно будут иметь значение, только если у вас есть несколько t1.созданных в одно и то же точное время.