我正在尝试选择每个用户的最新付款。我现在的查询选择用户的第一次付款。i、 e.如果一个用户已经支付了两次,并且 payment.id
s是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
,但查询似乎忽略了它,仍然选择第一笔付款。
感谢大家的帮助。谢谢。
6条答案
按热度按时间6rqinv9w1#
我很久以前就读过下面的解决方案,但是我找不到信贷的链接,下面是:
要了解它是如何工作的,只需放下
WHERE payments2.id IS NULL
您将看到发生了什么,例如,它可能会产生以下输出(我还没有构建模式来测试这个,所以它是伪输出)。假设中有以下记录payments
:以及上面的sql(没有
WHERE payments2.id IS NULL
条款)应产生:正如您所看到的,最后一行生成所需的结果,因为没有
payments2.id > 4
,左连接将导致payments2.id = NULL
.我发现这个解决方案(从我早期的测试中)比公认的答案快得多。
使用不同的模式但类似的查询,共16095条记录:
与max/subquery的接受答案相比:
6tqwzwtp2#
我刚刚处理了几乎完全相同的问题,发现这些答案很有用。我的测试似乎表明你可以使它比公认的答案稍微简单一点,即:
我还没有测试性能的差异,但数据库我的工作有超过50000个用户和超过60000支付和查询运行在0.024秒。
gajydyqb3#
我以前见过这个。groupby更适用于聚合表达式或相同的记录。我的研究发现这样做是最佳实践:
gstyhher4#
您需要groupwise最大值;本质上,对payments表进行分组以标识最大记录,然后将结果与它自身连接起来以获取其他列:
请注意
MAX(id)
可能不是“最近的付款”,这取决于您的应用程序和模式:通常最好根据TIMESTAMP
而不是基于合成标识符,比如AUTO_INCREMENT
主键列。3j86kqsm5#
更进一步,我们还可以使用:
……但在我的背景下,这个问题也花了太长时间。内部选择吸烟快,但外部需要一段时间,只有124个结果来自内部。思想?
hpcdzsge6#
我的解决方案: