2013-02-08 90 views
0

1.Purchase表MySQL的 - 檢索最後一條記錄在每個分組

Id user  pur_type 
---------------------- 
1 408  5-12 
2 408  5-12 
3 222  1-11 
4 222  5-12 
5 408  1-11 
6 408  1-11 

2.產品表

Id parts days 
----------------- 
1 1-11  50 
2 5-12  40 

我實現這樣的查詢

SELECT p1.id, p1.user, p1.pur_type, g.parts, g.days 
FROM purchase p1 
INNER JOIN goods g ON p1.pur_type = g.parts 
LEFT JOIN goods p2 ON (p1.pur_type= p2.pur_type 
AND p1.id < p2.id) 
WHERE p2.id IS NULL 

結果是隻剩下最後記錄每個pur_type

Id user pur_type parts days 
--------------------------------- 
4 222  5-12  5-12 40 
6 408  1-11  1-11 50 

如何獲得每個pur_typepurchase表中最後一條記錄,供一個特定用戶使用?

例如用於用戶408需要導致:

Id user  parts days 
------------------------- 
2 408  5-12 40 
6 408  1-11 50 

結果的解釋:FOT part 5-12用戶408
最後的記錄是id = 2
part 1-11用戶408最後一個記錄是id = 6

+0

當然'LEFT JOIN產品p2'應是'LEFT JOIN購買p2'嗎? – 2013-02-08 12:48:35

+0

商品表中的ID列實際上是多餘的? – Strawberry 2013-02-08 12:49:03

回答

0
SELECT a.*, c.* -- select columns youw ant 
FROM Purchase a 
     INNER JOIN 
     (
      SELECT user, MAX(ID) max_ID 
      FROM Purchase 
      GROUP BY user, pur_type 
     ) b ON a.user = b.user AND 
       a.ID = b.max_ID 
     INNER JOIN goods c 
      ON a.pur_type = c.parts 
WHERE a.USER = 408 

獲得更好的性能,在parts列於表goods添加一個索引,以及對pur_type

+0

其工作,謝謝! – 2013-02-08 12:59:27

+0

不客氣':D' – 2013-02-08 13:04:03

0

一個簡單的修改現有的查詢:

SELECT p1.id, p1.user, p1.pur_type, g.parts, g.days 
FROM purchase p1 
INNER JOIN goods g ON p1.pur_type = g.parts 
LEFT JOIN purchase p2 
     ON (p1.pur_type= p2.pur_type AND p1.id < p2.id AND p1.user=p2.user) 
WHERE p2.id IS NULL and p1.user = 408 
+0

結果將只是408的最後一條記錄 – 2013-02-08 13:00:01

+0

上一個答案是正確的 – 2013-02-08 13:02:18

+0

@ user2054164:該查詢將爲指定用戶返回每個'pur_type'的購買表的最後一條記錄 - 請參閱http://www.sqlfiddle.com/#!2/9b487/11。兩個答案都是正確的,但這個答案更接近你的原始查詢。 – 2013-02-08 13:13:41

相關問題