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

标签 mysql sql greatest-n-per-group

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

例如,我有一个 Order 表和一个 OrderStatus 表,我想获取具有特定状态的 Order,但前提是它是最后一个 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 = pending?

最佳答案

您可以使用 having 子句获取最后状态为“pending”的 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 并将其与“pending”的最大 id 进行比较。

关于mysql - 如何对 "group by"子句进行排序,以便返回的值是最后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53367422/

相关文章:

SQL 查询从每个类别中选择底部 2

mysql - 在组上选择 MAX() 不会返回相应的同级列

mysql - 加速使用 WHERE id IN 的查询

java - hibernate 不进行急切获取(使用获取 ="join"和惰性 ="false")

javascript - 如何对触发 JavaScript 函数的按钮使用 php foreach 循环

mysql - 在 SQL 表中的多个列上查找重复项以创建 UNIQUE 索引

php - 我正在尝试使用 php 代码删除使用复选框选择的行

java - 如何从java确定mysql中存储过程中没有参数

mysql - 如何对 MySQL 的 varchar 值进行排序

mysql - 基于sql中另一列中的值的增量值