[英]MySQL group by last entry
我的表payment_status包含以下字段:
许多条目可能具有相同的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.