Я предполагаю, что вы можете присоединиться к order_status_change on order_items.ID = order_status_change.ORDER_ITEM_ID
Если это действительно так, то я думаю, что вы достигнете того, что вам нужно:
SET @UserID = 160;
SET @OrderDateTime = '2018-11-13 09:23:45';
SELECT
order_items.ORDER_ID
, listing_region.LIST_REGION_REGION_ID
, listings.LISTING_ID
, order_items.ORDER_REQUIRED_DATE_TIME
, listings.LISTING_NICK_NAME
, order_items.ORDER_QUANTITY
, order_price.ORDER_PRICE_ID
, order_items.ORDER_PORTION_SIZE
, t.LATEST_DATE
, order_status_change.ORDER_STATUS
FROM order_items
INNER JOIN listings ON listings.LISTING_ID = order_items.ORDER_LISTING_ID
INNER JOIN listing_region ON listing_region.LIST_REGION_LISTING_ID = listings.LISTING_ID
INNER JOIN order_price ON order_price.ORDERP_ITEM_ID = order_items.ORDER_ITEM_ID
INNER JOIN order_status_change ON order_items.ID = order_status_change.ORDER_ITEM_ID
INNER JOIN (
SELECT
MAX( mc.ORDER_STATUS_CHANGE_DATETIME ) AS LATEST_DATE
, mc.ORDER_ITEM_ID
FROM order_status_change AS mc
GROUP BY
mc.ORDER_ITEM_ID
) AS t
ON order_status_change.ORDER_ITEM_ID = t.ORDER_ITEM_ID
AND order_status_change.ORDER_STATUS_CHANGE_DATETIME = t.LATEST_DATE
WHERE order_items.ORDER_USER_ID = @UserID
AND DATE( order_items.ORDER_REQUIRED_DATE_TIME ) = DATE( @OrderDateTime )
Вам нужно избегать этого в будущем:
FROM order_status_change , order_items
Эта запятая между двумя именами таблиц IS соединение, но оно имеет более старый синтаксис и имеет НИЖЕ приоритет, чем другие объединения вашего запроса.Кроме того, по умолчанию это объединение на основе запятых действует как эквивалент cross join
, который умножает количество строк.Короче говоря, НЕ ИСПОЛЬЗУЙТЕ запятые между именами таблиц.
Другая проблема заключается в том, что вы пропустили предложение group by
, и я считаю, что вы просто хотите получить «самую последнюю» дату из этой агрегации, как только этоопределяется ссылка на эту таблицу, чтобы получить статус, соответствующий этой дате.(т.е. вы не можете группировать по статусу в подзапросе, в противном случае вы получите самую последнюю дату (по одному на каждый статус).