2012-09-20 33 views
3

我的表PAYMENT_STATUS有這些字段:MySQL的組通過最後一項

  • ID
  • payment_id
  • 狀態
  • 創建
  • CREATED_BY

許多條目可能具有相同的payment_id ...所以,我想獲得一個payment_id的最後狀態...

我有這個請求的工作,但需要太多的時間來加載...我想有一個優化的版本,以payment_id分組,並採取最後一個狀態。

SELECT pstatus.* 
FROM `payment_status` AS pstatus 
WHERE pstatus.id = (
    SELECT id 
    FROM `payment_status` 
    WHERE pstatus.status = '200' 
    ORDER BY created DESC 
    LIMIT 1 
) 
GROUP BY pstatus.payment_id 
ORDER BY pstatus.payment_id DESC 
+0

那麼,您是否想要像查詢中所說的那樣獲得最後一個付款ID_的狀態_或者_對於所有付款_您似乎在查詢中正在執行的操作?實際上,你的內部查詢是錯誤的,並且將根據外部查詢的'pstatus.status'是否爲'''',而不僅僅是那些具有'payment_id'匹配的查詢來排序_none_或_all_支付行。 – lanzz

+0

你在那裏得到了很多好的建議。 –

+0

請評價並接受適合您的答案。 –

回答

3

嘗試此查詢 -

SELECT t1.* FROM payment_status t1 
    JOIN (SELECT payment_id, MAX(created) max_created 
     FROM payment_status 
     GROUP BY payment_id 
     ) t2 
    ON t1.payment_id = t2.payment_id AND t1.created = t2.max_created; 

...然後添加WHERE條件你需要的。

+0

正是我需要的......非常感謝! 0.0025秒加載此查詢:-) –

1

嘗試使用JOIN

SELECT p1.* 
FROM payment_status p1 
INNER JOIN 
(
    SELECT id, MAX(created) MaxCreated 
    FROM payment_status 
    WHERE status = '200' 
    GROUP BY id 
) p2 ON p1.id = p2.id AND p1.created = p2.MaxCreated 
ORDER BY p1.payment_id DESC 
+0

感謝您的幫助,但此查詢會加載每個組的所有狀態,而不僅僅是最近的一個。 –

0

應該不會喲ujust能夠做到這一點?:

(假設創建爲時間戳,所以 「最後一個」=「最最近「)

SELECT pstatus.* 
FROM `payment_status` AS pstatus 
GROUP BY pstatus.payment_id, pstatus.status 
ORDER BY pstatus.payment_id DESC, pstatus.created DESC 

每一行返回應該具有最近狀態的payment_id。

+0

感謝您的幫助,但此查詢會加載每個組的所有狀態,而不僅僅是最近的一個。 –

1

這應該工作

SELECT * 
FROM payment_status 
WHERE status = '200'  
ORDER BY created DESC 
LIMIT 1 
+0

這隻載入所有狀態的最後一個狀態:-) –

0

我想你正在使用MySQL數據庫。

在這裏,我有一個解決方案是快速和可讀性:

select 
    substring_index(
     group_concat(status order by created desc) 
     , ',', 1 
    ) as status_latest 
from payment_status 
group by payment_id 

我敢肯定它比其他的SQL語句, 快你可以試試它。