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

Working Demo

注意:如果您希望每个用户最多输入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;

WORKING DEMO V2

点赞