台灣最大程式設計社群網站
線上人數
402
 
會員總數:245486
討論主題:189239
歡迎您免費加入會員
討論區列表 >> MySQL >> 請教一個麻煩的 SQL 語法?要找出每個會員的最新一筆訂單資料
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請教一個麻煩的 SQL 語法?要找出每個會員的最新一筆訂單資料
價值 : 0 QP  點閱數:50563 回應數:14

樓主

Jeremy
初學者
25 9
144 18
發送站內信

請教大大,在一堆訂單裡,我想要找出每個會員的最新一筆訂單資料,該如何寫SQL呢?

table

會員ID  訂單編號   訂單日期     訂單內容
------------------------------------------
001     a0001      2004-09-01   訂單內容1
001     a0002      2004-09-15   訂單內容2
002     a0003      2004-09-17   訂單內容3
001     a0004      2004-09-21   訂單內容4
003     a0005      2004-09-24   訂單內容5
002     a0006      2004-09-24   訂單內容6
001     a0007      2004-10-01   訂單內容7


我下了一個 SQL 語法:SELECT * FROM table GROUP BY 會員ID

查詢結果如下(秀出來的資料是每個 group 裡的第一筆):

會員ID  訂單編號   訂單日期     訂單內容
------------------------------------------
001     a0001      2004-09-01   訂單內容1
002     a0003      2004-09-17   訂單內容3
003     a0005      2004-09-24   訂單內容5

可是我想要秀出每個 group 裡的最後一筆,也就是要秀出每個會員的最新一筆訂單,如下:

會員ID  訂單編號   訂單日期     訂單內容
------------------------------------------
003     a0005      2004-09-24   訂單內容5
002     a0006      2004-09-24   訂單內容6
001     a0007      2004-10-01   訂單內容7


SQL 語法該怎麼下呢?
我試過 HAVING, ORDER BY 等等,還是都沒辦法...
試了半天實在試不出來,請前輩指教?

本篇文章發表於2004-09-01 23:07
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

小白
捐贈 VP 給 Marcus 檢舉此回應
>>我想要找出每個會員的最新一筆訂單資料
即是說你要求的 SQL 是:
1. 找出由該會員訂購的紀錄
2. 以訂購日期排序,由後至前
3. 只要首一筆資料

你能根據這幾項要求寫出一句 SQL 嗎?

這媯鳩A一些在下的拙作參考:
http://www22.brinkster.com/cccentre/passage/show.asp?id=63
http://www22.brinkster.com/cccentre/passage/show.asp?id=64
http://www22.brinkster.com/cccentre/passage/show.asp?id=65
http://www22.brinkster.com/cccentre/passage/show.asp?id=67
http://www22.brinkster.com/cccentre/passage/show.asp?id=68

加油!
本篇文章回覆於2004-09-01 23:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Jeremy
檢舉此回應
我拜讀過大大的文章,整理的非常棒耶!
對初學者會有很大的幫助。

可是還是找不到我的需求,但是還是謝謝大大唷!
本篇文章回覆於2004-09-02 08:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

小白
捐贈 VP 給 Marcus 檢舉此回應
其實上面的回覆我已替你整理好了你的問題:
1. 找出所有該會員的訂購紀錄 (where 會員ID='xxx')
2. 以訂購日期排序,由後至前 (order by 訂單日期 DESC)
3. 只要首一筆資料 (Limit 1)

我只是重覆演譯你的問題,但是根據這三個條件,寫出 SQL 的確會容易得多。

請嘗試自行整理出一句 SQL ,相信這會是一個很好的練習。

加油!
本篇文章回覆於2004-09-02 22:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

小凡
檢舉此回應
select * from table a where 
訂單日期=(select max(訂單日期) from table where 會員id=a.id)

試試看~
本篇文章回覆於2004-09-03 14:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

Jeremy
檢舉此回應
感謝小白大大的建議,但是你的條件式只能找出一個會員的最新一筆訂單,這是最基本的SQL語法,我瞭解。

因為我的需求有點複雜,可能是因為我把問題簡化了,害大家誤會只是一個簡單的題目。我真正的的需求是希望列出所有會員的最新一筆訂單,而且訂單的日期是搜尋條件之一,而且列出來的記錄還需要能換頁。

小凡建議的語法好像不錯,可以試試,但是我也用了另外一個解決方法了。

我先建立一個暫存表格
create temporary table tmp select 會員ID, max(訂單編號) as maxdate, max(訂單日期) from table group by 會員ID

然後再用暫存表格 tmp 來做各種 SQL 查詢及換頁動作
本篇文章回覆於2004-09-04 09:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

March
檢舉此回應
這麼久的文章, 不過好像沒有人回應方法, 所以我就提供一下我的方式
也歡迎大家提供更好的方案喲
http://diary.tw/march/entry/sqlselect
本篇文章回覆於2008-11-04 15:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

溫子
捐贈 VP 給 溫子 檢舉此回應
Orz 這邊是 MySQL 版... 可沒有 top 這個東西...
所以提醒未來看到此題的人 #6 的回答不適用於 MySQL ...
本篇文章回覆於2008-11-04 18:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
特地挖出四年前的發問...真有你的- -
TOP好像只有MSSQL及PostgreSQL能用?
本篇文章回覆於2008-11-05 17:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

nick
檢舉此回應
SELECT top 1 * FROM table GROUP BY 會員ID order by 訂單日期
本篇文章回覆於2012-03-02 14:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
唉~~~~怎麼將古董級的文章又挖出來了。
本篇文章回覆於2012-03-03 09:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

力胖
檢舉此回應
select distinct id, 訂單編號 from table order by 訂單編號 desc
我沒有試過,你可以看能不能這樣子下!!
本篇文章回覆於2012-03-07 12:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

小四
檢舉此回應

本篇文章回覆於2012-05-02 18:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

felisa
檢舉此回應
select * from (SELECT id,no,date,content,ROW_NUMBER() OVER (PARTITION BY id ORDER BY no desc,date desc) as rank from test) as a where rank=1

id 會員ID
no 訂單編號
date 訂單日期
content 訂單內容
本篇文章回覆於2020-02-13 16:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
沒想到事隔8年,我居然對同一篇文章說這句話
唉~~~~怎麼將古董級的文章又挖出來了。
本篇文章回覆於2020-02-26 10:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.