Почему я не могу присоединиться к этому запросу с датой Max? - PullRequest
0 голосов
/ 29 ноября 2018

У меня проблема со следующим запросом mySQL, когда он не выполняется, когда вводится максимальная дата, как показано ниже.Я получаю следующую ошибку

Код ошибки: 1054. Неизвестный столбец 'order_items.ORDER_ITEM_ID' в 'выражении where'

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,
t.ORDER_STATUS


FROM order_status_change, 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 
  (
     SELECT MAX(order_status_change.ORDER_STATUS_CHANGE_DATETIME) AS LATEST_DATE, order_status_change.ORDER_ITEM_ID, order_status_change.ORDER_STATUS
     FROM order_status_change
     WHERE order_status_change.ORDER_ITEM_ID = order_items.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))

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я предполагаю, что вы можете присоединиться к 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, и я считаю, что вы просто хотите получить «самую последнюю» дату из этой агрегации, как только этоопределяется ссылка на эту таблицу, чтобы получить статус, соответствующий этой дате.(т.е. вы не можете группировать по статусу в подзапросе, в противном случае вы получите самую последнюю дату (по одному на каждый статус).

0 голосов
/ 29 ноября 2018

Вот упрощенная версия, чтобы проиллюстрировать проблему.

DROP TABLE IF exists t,t1;

create table t (id int);
create table t1(id int,dt date);

insert into t values (1),(2);
insert into t1 values (1,'2018-01-01'),(1,'2018-02-01'),(2,'2018-01-01');

select t.*,t2.maxdt
from t
join (select max(dt) maxdt,t1.id from t1 where t1.id = t.id) t2
    on t2.id = t.id;

ERROR 1054 (42S22): Unknown column 't.id' in 'where clause'

Вы можете сгруппировать в подзапросе, и тогда вступит в силу предложение on

select t.*,t2.maxdt
from t
join (select max(dt) maxdt,t1.id from t1 group by t1.id) t2
    on t2.id = t.id;

+------+------------+
| id   | maxdt      |
+------+------------+
|    1 | 2018-02-01 |
|    2 | 2018-01-01 |
+------+------------+
2 rows in set (0.00 sec)

Если вы хотитеответ ближе к вашей проблеме, пожалуйста, добавьте пример данных и ожидаемый результат к вопросу в виде текста в sqlfiddle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...