一尘不染

在MySQL中使用GROUP BY选择最近的行

mysql

我正在尝试选择每个用户的最新付款。我现在的查询选择了用户的第一笔付款。即,如果用户进行了两次付款,并且payment.ids分别为10和11,则查询将选择具有付款ID
10而不是11的信息的用户。

  SELECT users.*, payments.method, payments.id AS payment_id 
    FROM `users` 
         LEFT JOIN `payments` ON users.id = payments.user_id 
GROUP BY users.id

我已添加ORDER BY payments.id,但查询似乎忽略了它,仍然选择了第一笔付款。

所有帮助表示赞赏。谢谢。


阅读 286

收藏
2020-05-17

共1个答案

一尘不染

你要分组最大值 ;
本质上,将付款表分组以标识最大记录,然后将结果与其自身重新结合以获取其他列:

SELECT users.*, payments.method, payments.id AS payment_id
FROM   payments NATURAL JOIN (
  SELECT   user_id, MAX(id) AS id 
  FROM     payments
  GROUP BY user_id
) t RIGHT JOIN users ON users.id = t.user_id

请注意,根据您的应用程序和架构,它MAX(id)可能不是“ 最新付款 ”:通常最好基于“综合” 来确定“ 最新
”,而TIMESTAMP不是基于诸如AUTO_INCREMENT主键列之类的综合标识符。

2020-05-17