繁体   English   中英

MySQL组由最后一个条目组成

[英]MySQL group by last entry

我的表payment_status包含以下字段:

  • ID
  • payment_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

试试这个查询 -

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

尝试使用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

这应该工作

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

你不应该这样做吗?:

(假设创建的是时间戳,所以“last”=“最近”)

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。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM