我有一个查询,我想在其中获取联接表中的最后一项,但我想对该联接进行过滤。当我使用“ 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 =待处理?
答案 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 )
但是我不确定。