当前位置: 首页 > 面试题库 >

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

欧阳永宁
2023-03-14
问题内容

我正在尝试选择每个用户的最新付款。我现在的查询选择了用户的第一笔付款。即,如果用户进行了两次付款,并且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,但查询似乎忽略了它,仍然选择了第一笔付款。

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


问题答案:

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

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主键列之类的综合标识符。



 类似资料:
  • 问题内容: 这可能比我做的要容易,但是基本上我需要做的是选择列中具有最接近数字的行作为指定值。例如: 数据库中指定列中的3行的值列表:10、15、16 如果我指定我想要最接近14的行,它将选择15的行。 另外,如果有2+行相同的距离,则随机选择其中之一。 问题答案: 一种选择是遵循以下方式: 要选择随机记录,可以将其添加到子句中。这种方法的缺点是您不能从索引中得到任何好处,因为您必须对派生值进行排

  • 问题内容: 我试图选择一个表中的最后6个月的条目,我有一列称为datetime,这是一种datetime mysql格式。 我已经看到许多使用间隔和其他方法的方法-应该使用哪种方法?谢谢 问题答案: 使用DATE_SUB

  • 问题内容: 如何在MySQL表中最后一行? 我正在读取数据,我需要从上一行中检索列值。 桌子上有一个。 问题答案: 是的,那里有一个auto_increment 如果您想要表中 所有行 的最后 一行 ,那么最后就是正确答案的时候了!有点儿:

  • 问题内容: 我有一张用户签入和签出时间的表(“ lms_attendance”),如下所示: 我正在尝试创建此表的视图,该表将仅输出每个用户ID的最新记录,同时给我“ in”或“ out”值,如下所示: 到目前为止,我已经很接近了,但是我意识到视图将不接受子查询,这使它变得更加困难。我得到的最接近的查询是: 但是我得到的是: 这很接近,但并不完美。我知道最后一个分组依据不应存在,但是如果没有它,它

  • 我有一个HTML页面中的一长串表。以下只是列表的一小部分。 我想检查

  • 问题内容: Iam试图弄清楚数据是在大约5分钟内保存到数据库的。 是Unix时间戳(1970年以来的毫秒)。 不起作用,我得到null而不是0,如果我使用 要执行操作,代码不会进入循环。 我也试过了 问题答案: Current_timestamp以SQL TIMESTAMP(而不是UNIX时间戳)的形式返回当前日期,因此您必须使用unix_timestamp函数进行转换: 编辑: 由于您的列中包含