mysql中选择用户_mysql – 从表中选择最近n个所有用户的条目

我有一个下表,并希望只选择所有用户的最后2个条目.

来源表:

-------------------------------------

UserId | QuizId(AID)|quizendtime(AID)|

--------------------------------------

1 10 2016-5-12

2 10 2016-5-12

1 11 2016-6-12

2 12 2016-8-12

3 12 2016-8-12

2 13 2016-8-12

1 14 2016-9-12

3 14 2016-9-12

3 11 2016-6-12

预期输出就像,(应该只列出所有用户最近的2个quizid条目)

-------------------------------------

UserId | QuizId(AID)|quizendtime(AID)|

--------------------------------------

1 14 2016-9-12

1 11 2016-6-12

2 13 2016-8-12

2 12 2016-8-12

3 14 2016-9-12

3 12 2016-8-12

任何想法产生这个输出.

最佳答案 使用MySQL用户定义的变量,您可以完成此任务:

SELECT

t.UserId,

t.`QuizId(AID)`,

t.`quizendtime(AID)`

FROM

(

SELECT

*,

IF(@sameUser = UserId, @a := @a + 1 , @a := 1) row_number,

@sameUser := UserId

FROM your_table

CROSS JOIN (SELECT @a := 1, @sameUser := 0) var

ORDER BY UserId , `quizendtime(AID)` DESC

) AS t

WHERE t.row_number <= 2

注意:如果您希望每个用户最多输入x个条目,请更改where子句中的条件,如下所示:

在哪里t.row_number< = x 说明:

SELECT

*,

IF(@sameUser = UserId, @a := @a + 1 , @a := 1) row_number,

@sameUser := UserId

FROM your_table

CROSS JOIN (SELECT @a := 1, @sameUser := 0) var

ORDER BY UserId , `quizendtime(AID)` DESC;

此查询按userId的升序和quizendtime(AID)的降序对所有数据进行排序.

现在,对这个(多个)排序数据进行分析.

每次看到新的userId都会分配一个row_number(1).如果再次看到同一个用户,则只需增加row_number.

最后,仅过滤那些具有row_number <= 2的记录,确保每个用户最多两个最新条目. 编辑:正如戈登所指出的那样,在mysql中使用用户定义变量的表达式的评估并不保证始终遵循相同的顺序,因此基于上述查询稍作修改:

SELECT

t.UserId,

t.`QuizId(AID)`,

t.`quizendtime(AID)`

FROM

(

SELECT

*,

IF (

@sameUser = UserId,

@a := @a + 1,

IF(@sameUser := UserId, @a := 1, @a:= 1)

)AS row_number

FROM your_table

CROSS JOIN (SELECT @a := 1, @sameUser := 0) var

ORDER BY UserId , `quizendtime(AID)` DESC

) AS t

WHERE t.row_number <= 2;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值