Поскольку оказывается, что вы используете 8.3.8
(из комментария к удаленному ответу), вы не можете использовать row_number()
. Это означает, что я склонен присоединяться к совокупному подзапросу, чтобы определить, какая запись является самой новой. Что-то вроде ...
SELECT
i.id,
i.title,
i.city,
i.state,
i.country,
d.price,
d.description,
s.status_city,
s.status_state,
s.status_country
FROM
items i
LEFT JOIN
item_shipping_details d
ON i.id = d.item_id
LEFT JOIN
(SELECT item_shipping_detail_id, MAX(created_at) AS created_at FROM statuses GROUP BY item_shipping_detail_id) lookup
ON lookup.item_shipping_detail_id = d.id
LEFT JOIN
statuses s
ON s.item_shipping_detail_id = lookup.item_shipping_detail_id
AND s.created_at = lookup.created_at
Примечание: Чтобы оптимизировать подзапрос и объединение, таблицу statuses
необходимо правильно проиндексировать; (item_shipping_detail_id, created_at)
Если вместо этого у вас есть индекс (item_shipping_detail_id, id)
, и вы можете гарантировать, что более высокий id
всегда означает, что запись новее, чем запись с более низким id
, вы можете заменить в моем запросе вхождения created_at
на id
.