как отсортировать предложение group by, чтобы возвращаемое значение было последним - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть запрос, где я хочу получить последний элемент в объединенной таблице, но я хочу отфильтровать это объединение. когда я использую предложение «group by», оно возвращает первое значение, а не последнее. как мне получить последнее вместо этого?

например, у меня есть таблица Order и таблица OrderStatus, я хочу получить Order с определенным статусом, но только если это последний OrderStatus ...

Таблица OrderStatus ...

ID | OrderID | Status
---------------------
1  | 1       | cart
2  | 1       | pending
3  | 1       | paid
4  | 2       | cart
5  | 2       | pending

Так что для Status = pending я хочу вернуть только OrderID 2, а не OrderID 1. Вот что я попробовал:

select * from `Order` where `ID` in 
(select `OrderID` from `OrderStatus` where `status` like 'pending' 
group by `OrderID` order by `ID` DESC)

но возвращает оба заказа. предложение order by игнорируется, я думаю, оно применяется к запросу после группировки, а не до. Как я могу получить OrderStatus = в ожидании, только если он последний?

Ответы [ 2 ]

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

Если я правильно понимаю, вы получите последний с простым лимитом 1 после заказа следующим образом:

выберите * из Order где ID в (выберите OrderID из OrderStatus где status как «ожидающая» группа по OrderID порядок по ID DESC LIMIT 1 )

Но я не уверен, что.

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

Вы можете получить orderid s с последним статусом "в ожидании", используя предложение having:

select o.*
from Orders o
where o.id in (select os.orderid
               from orderstatus os
               group by os.orderid
               having max(os.id) = max(case when os.status = 'pending' then os.id end)
              );

Сравнение работает путем вычисления наибольшего id и сравнения его снаибольший id для "в ожидании".

...