基本上,考虑到最后的创建日期时间,我只需要获取每个用户的最后 2 条记录:
id | user_id | created_datetime
1 | 34 | '2015-09-10'
2 | 34 | '2015-10-11'
3 | 34 | '2015-05-23'
4 | 34 | '2015-09-13'
5 | 159 | '2015-10-01'
6 | 159 | '2015-10-02'
7 | 159 | '2015-10-03'
8 | 159 | '2015-10-06'
返回(预期输出):
2 | 34 | '2015-10-11'
1 | 34 | '2015-09-10'
7 | 159 | '2015-10-03'
8 | 159 | '2015-10-06'
我正在尝试这个想法:
select user_id, created_datetime,
$num := if($user_id = user_id, $num + 1, 1) as row_number,
$id := user_id as dummy
from logs group by user_id
having row_number <= 2
这个想法是只保留前两行并删除所有其他行。
有任何想法吗?
你的想法很接近。我认为这样会更好:
select u.*
from (select user_id, created_datetime,
$num := if(@user_id = user_id, @num + 1,
if(@user_id := id, 1, 1)
) as row_number
from logs cross join
(select @user_id := 0, @num := 0) params
order by user_id
) u
where row_number <= 2 ;
以下是变化:
- 变量仅在一个表达式中设置。 MySQL 不保证表达式求值的顺序,因此这一点很重要。
- 该工作在子查询中完成,然后在外部查询中进行处理。
- 子查询使用
order by
, not group by
.
- 外部查询使用
where
代替having
(实际上,在MySQL中having
会起作用,但是where
更合适)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)