2011-09-10 51 views
1

最后挂单我有Customers创造了一些Order小号存储在订单postgres db.Some可能有'pending' status.I希望用户能够在他的最后挂单工作。检索客户

顺序表

id | order_num | order_date |customer_id | status 
-----+-----------+------------+------------+--------- 
80 | 1234  | 02-01-2000 | 20   | pending 
---------------------------------------------------- 
81 | 2345  | 02-01-2000 |20   | confirmed 
----------------------------------------------------- 
82 | 3456  | 02-01-2000 |20   | pending 
-------------------------------------------------- 
83 | 3498  | 02-001-2000| 20  | confirmed 
---------------------------------------------------- 

这有什么错用

select * from orders where customer_id =20 and status='pending' order by id DESC limit 1 

多个记录的order_date的可能same.The订单号可能并不总是按升序排列。在这方面是否通过id命令安全?

+0

如何根据'order_num'排序? –

回答

1

您应该由order_dateid订购作为辅助排序关键字:

select * 
from orders 
where customer_id = 20 
    and status  = 'pending' 
order by order_date desc, id desc 
limit 1 

你想要最近的订单,所以你应该排序来表达这个意图。您还必须处理重复的order_date值,因此您可以将id作为辅助排序键,希望能够获取最新的order_date中的最新值。这假定idserialbigserial列。

只要在创建记录后不允许更改order_date,则使用order by id desc即可。但是,如果你的代码很明显,你的意图是什么,维护你的代码的人(可能是你)可能会在你确切地表达你的意思时欣赏它。

+0

这是很好的建议。但是,我想知道如果完全基于id排序有任何缺陷? –

+1

@Damon:唯一的缺陷是'order_date'可能会改变。很可能它不会改变,'id'基于一个序列,如果是这样的话,'id'几乎就是“插入顺序”,所以'id by desc'可以工作。 –

0

你可以做最-N-分析相对于日期和状态查找最顶端的记录

+0

正如我所说,几个记录可能有相同的order_date –