2

我有一个名为 log_payment 的表,其中包含一系列付款记录,例如:

log_user_id, log_date, log_payment_id

13, 2013-01-01 01:13:00, TRIAL<BR>
13, 2013-01-02 01:18:00, 1<BR>
13, 2013-01-03 01:05:00, 2

我想得到的是用户上次记录的付款 ID 和日期。所以我希望 user_id 的最后一笔交易是 01/03 并且付款 id 为 2。所以我写了这个查询:

select max(log_date) as max_date,log_user_id,log_payment_id from log_payment group by log_user_id

但它返回13, 2013-01-03 01:05:00, TRIAL

因此,根据我在其他地方找到的一些数据,我尝试了这个:

select log_user_id, max_date, log_payment_id from (select log_user_id,max(log_date) as max_date from log_payment group by _log_user_id) payment_table inner join log_payment on payment_table.log_user_id = log_payment.log_user_id and payment_table.max_date = log_payment.log_date

但这持续了几分钟,直到我最终取消它。我错过了什么?

4

2 回答 2

1

Group by order 的最佳解决方案是使用子查询为您创建 order by:

SELECT t1.*
FROM `log_payment` t1
WHERE `id` = (
    SELECT `id`
    FROM `log_payment` `t2`
    WHERE `t2`.`log_user_id` = `t1`.`log_user_id`
    ORDER BY `t2`.`log_date` DESC
    LIMIT 1
)

它也应该非常快。当然,它总是依赖于您的索引设置。

于 2013-06-03T02:12:47.907 回答
1

除了 group by 中的 _log_user_id 之外,您的查询(我已重新解析)看起来不错。它应该是 log_user_id:

 select log_user_id, 
        max_date, 
        log_payment_id from 
        (select log_user_id,max(log_date) as max_date from log_payment group by _log_user_id)
              payment_table 
        inner join 
        log_payment 
        on payment_table.log_user_id = log_payment.log_user_id and 
           payment_table.max_date = log_payment.log_date

根据表的大小,查询可能会很慢。尝试在查询末尾添加 LIMIT 10 以查看前 10 个元组是否可以获得所需的结果。

--dmg

于 2013-06-03T01:36:19.837 回答