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
- 地位
- 创造
- 创建于
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