我有一个名为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
但是这种情况持续了几分钟,直到我最终取消了它。我错过了什么?
您的查询,我已经修复,看起来不错,除了组中的_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
Group by order的最佳解决方案是使用子查询为您制作订单:
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
)
它也应该非常快。当然,它总是依赖于你的索引设置。