2011-09-10 55 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 –