3

我的表 payment_status 有这些字段:

  • ID
  • 付款ID
  • 地位
  • 创建
  • 由...制作

许多条目可能具有相同的 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
4

5 回答 5

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 条件。

于 2012-09-20T12:55:17.893 回答
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
于 2012-09-20T12:52:48.743 回答
1

这应该工作

SELECT *
FROM  payment_status
WHERE status = '200'    
ORDER BY created DESC
LIMIT 1
于 2012-09-20T12:55:02.060 回答
0

你不应该能够做到这一点吗?:

(假设 created 是时间戳,所以 "last" = "most recent")

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。

于 2012-09-20T12:55:00.140 回答
0

我想你正在使用 MySQL 数据库。

在这里,我有一个快速且易读的解决方案:

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

我很确定它比其他 SQL 语句快,你可以试试。

于 2013-06-28T06:23:55.767 回答