MySQL按最后一项分组

MySQL按最后一项分组,mysql,Mysql,“我的表付款”状态包含以下字段: 身份证 付款id 地位 创造 创建于 许多条目可能具有相同的付款id。。。因此,我想获取一个付款id的最后状态 我有这个要求,工作,但需要太多的时间来加载。。。我想有一个优化版本,以支付组_id和采取最后的状态 SELECT pstatus.* FROM `payment_status` AS pstatus WHERE pstatus.id = ( SELECT id FROM `payment_status` WHERE pstatus

“我的表付款”状态包含以下字段:

  • 身份证
  • 付款id
  • 地位
  • 创造
  • 创建于
许多条目可能具有相同的付款id。。。因此,我想获取一个付款id的最后状态

我有这个要求,工作,但需要太多的时间来加载。。。我想有一个优化版本,以支付组_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 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

难道你就不能这样做吗

(假设created是时间戳,所以“last”=“most-recented”)

每行退货都应该有带有最新状态的付款id。

这应该有效

SELECT *
FROM  payment_status
WHERE status = '200'    
ORDER BY created DESC
LIMIT 1
请尝试此查询-

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;

…然后在需要的地方添加条件。

我想您使用的是MySQL数据库

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

select 
    substring_index(
        group_concat(status order by created desc)
        , ',', 1
    ) as status_latest 
from payment_status 
group by payment_id
我很确定它比其他SQL语句快,
您可以试一试。

那么,您是想获得您在问题中所说的一个付款ID的最后状态,还是想获得您在查询中所做的所有付款的最后状态?实际上,您的内部查询是错误的,将根据外部查询的
pstatus.status
是否为
'200'
对无付款行或所有付款行进行排序,而且不仅仅是那些有匹配的
支付id
的人。你在下面得到了很多好的建议。请评价并接受适合你的答案。@Devart似乎有正确的解决方案。。。谢谢大家的帮助!正是我需要的。。。谢谢!0.0025秒加载此查询:-)感谢您的帮助,但此查询将加载每个组的所有状态,而不仅仅是最近的状态。感谢您的帮助,但此查询将加载每个组的所有状态,而不仅仅是最近的状态。此查询仅加载所有状态的最后状态:-)
select 
    substring_index(
        group_concat(status order by created desc)
        , ',', 1
    ) as status_latest 
from payment_status 
group by payment_id