我有一个下表,并希望只选择所有用户的最后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;