Присоединиться к первой действительной строке из другой таблицы в innodb

У меня есть 2 таблицы, одна из которых содержит записи с некоторыми данными, связанными с ней, а другая содержит исторические данные для первой таблицы.

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

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


person Sam    schedule 17.03.2011    source источник
comment
Поддерживает подзапросы MySQL следующим образом?: ... main_table INNER JOIN history_data ON (main_table.col = (ВЫБРАТЬ идентификатор новейших исторических данных)) ...   -  person Jan Zyka    schedule 17.03.2011


Ответы (2)


Предполагая, что историческая таблица имеет PK, состоящий из исходного идентификатора и отметки времени

SELECT table.*, ht1.*
FROM table INNER JOIN historical_table ht1
     ON table.id = ht1.id
     LEFT JOIN historical table ht2
     ON ht1.id = ht2.id AND ht1.timestamp < ht2.timestamp
WHERE ht2.timestamp IS NULL

Основная часть логики — выбор строк, для которых нет более новых записей (ht2.timestamp имеет значение null)

Это общий вопрос о максимальном количестве групп (и есть другие способы сделать это)

person Unreason    schedule 17.03.2011

Один из способов сделать это:

select record.id
(select history.id from history where history.record_id = record.id order by history.id desc limit 1) as history_id
from record

Если вам нужны полные запросы, вы можете просто использовать идентификатор из этого запроса в качестве подзапроса. Много других способов сделать это тоже :-)

person Dytut    schedule 17.03.2011