我有一个查询,我想在其中获取联接表中的最后一项,但我想过滤该联接。当我使用"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
分组,按ID
DESCLIMIT1(
但我不确定。