如何对"group by"子句进行排序,以便返回的值是最后一个



我有一个查询,我想在其中获取联接表中的最后一项,但我想过滤该联接。当我使用"groupby"子句时,它似乎返回第一个值,而不是最后一个值。我怎样才能得到最后一个?

例如,我有一个Order表和一个OrderStatus表,我想获得一个具有特定状态的Order,但前提是它是最后一个OrderState。。。

订单状态表。。。

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=挂起的情况下,我才能获得它?

您可以使用having子句获得最后状态为"挂起"的orderid

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进行比较。

如果我理解正确,你会在这样排序后得到最后一个带有简单限制1的:

Order中选择*,其中ID(从OrderStatus中选择OrderID,其中status类似于"挂起"按OrderID分组,按IDDESCLIMIT1(

但我不确定。

最新更新