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

时间:2018-11-19 02:11:31

标签: mysql sql greatest-n-per-group

我有一个查询,我想在其中获取联接表中的最后一项,但我想对该联接进行过滤。当我使用“ 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

因此对于状态=待处理,我只想返回OrderID 2而不是OrderID1。这是我尝试的方法:

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 :(得分:1)

您可以使用orderid子句来获取其最后状态为“待处理”的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进行“待定”进行比较。

答案 1 :(得分:-1)

如果我正确理解,您将在订购后得到带有简单极限1的最后一个:

Order中选择*,其中ID在 (从OrderID中选择OrderStatus,其中status就像“待定” 按OrderID分组,按ID分组DESC LIMIT 1

但是我不确定。