Mysql 获取每个类别的每个用户的最后记录

Mysql 获取每个类别的每个用户的最后记录,mysql,group-by,Mysql,Group By,我想获得每个类别的每个用户的最后一条记录 e、 我有一张桌子 测试id、cat id、用户id、分数、时间 我需要每个类别的每个用户的最后记录。我可以按类别id或用户id使用组,但我不知道如何获得我想要的结果 e、 我有以下记录 test_id | cat_id | user_id | score | time 1 | 1 | 11 | 20 | 2016-11-12 01:11:11 2 | 2 | 11 | 24 |

我想获得每个类别的每个用户的最后一条记录

e、 我有一张桌子

测试id、cat id、用户id、分数、时间

我需要每个类别的每个用户的最后记录。我可以按类别id或用户id使用组,但我不知道如何获得我想要的结果

e、 我有以下记录

test_id | cat_id | user_id | score | time
      1 |      1 |      11 |    20 | 2016-11-12 01:11:11
      2 |      2 |      11 |    24 | 2016-11-12 01:11:11
      3 |      1 |      12 |    25 | 2016-11-12 01:11:11
      4 |      3 |      12 |    21 | 2016-11-12 01:11:11
      5 |      1 |      13 |    22 | 2016-11-12 01:11:11
      6 |      2 |      12 |    23 | 2016-11-12 01:11:11
      7 |      2 |      12 |    27 | 2016-11-12 01:11:11
      8 |      1 |      11 |    21 | 2016-11-12 01:11:11
现在我需要下面的结果

test_id | cat_id | user_id | score | time
      2 |      2 |      11 |    24 | 2016-11-12 01:11:11
      3 |      1 |      12 |    25 | 2016-11-12 01:11:11
      4 |      3 |      12 |    21 | 2016-11-12 01:11:11
      5 |      1 |      13 |    22 | 2016-11-12 01:11:11
      7 |      2 |      12 |    27 | 2016-11-12 01:11:11
      8 |      1 |      11 |    21 | 2016-11-12 01:11:11

在上面的o/p中,每个用户的最后一个结果来自每个类别。

尝试此操作,按类别id从测试组中选择MAXuser\u id

这里我们需要所有类别的最后一个用户。因此,我们必须按类别分组,找到时间最长的用户

SELECT t1.* 
FROM tests t1
INNER JOIN
(
    SELECT max(time) MaxTime,user_id,cat_id
    FROM tests
    GROUP BY user_id,cat_id
) t2
  ON t1.user_id = t2.user_id
  AND t1.cat_id = t2.cat_id
  AND t1.time = t2.MaxTime
order by t1.time desc
您需要的查询是:

SELECT l.test_id, l.cat_id, l.user_id, l.score, l.time
FROM tests l                     # "l" from "last"
LEFT JOIN tests n                # "n" from "next"
    ON l.user_id = n.user_id     # match user
    AND l.cat_id = n.cat_id      # and category
    AND l.time <= n.time         # "next" is not before "last" (check the time)
    AND l.test_id < n.test_id    # "next" is after "last" when the times are equal
WHERE n.test_id IS NULL          # there is no "next" matching the JOIN conditions
工作原理 查询将别名为l from last的测试与别名为n from next after last的自身连接起来。左联接确保l中的所有行都包含在联接中。l中的每一行与n中包含相同用户id和cat id的所有行配对每个用户、每个类别,并且在“时间”和“测试id”列中具有更大的值。因为从技术上讲,在“用户id”、“cat id”和“时间”列中具有相同值的两行是可能的,在相同的时间内,将l中的行与后来输入数据库的n中的行进行匹配,它具有更大的自动递增测试id

当在n中找不到满足所有ON条件的行时,l中的行与一个满为null的行配对


WHERE条件只保留n.test_id中为NULL的行。它们是l中在n中不匹配的行,因为n中没有任何行在时间列中具有更大的值,或者在时间相等时具有更大的test_id。这些是每个用户、类别对的最后记录。

@草莓请现在检查问题,我希望您得到所需的信息。我可以按类别id或按用户id使用group-group by在这里没有帮助。它不会从表中获取行。GROUP BY使用它从表中读取的值生成值。几乎-但是你忘记了用户或cat-FIXEDno这不对我们不需要最后一个用户我们需要每个类别的所有用户都有最后一个records@user3110655已经修好了now@Strawberry完美的谢谢:@user3110655您说我不确定它是否工作,因为当前我在时间字段中有相同的时间,当我执行您的查询时,它给了我错误的结果,它给了我所有的结果。-无论输入数据如何,正确的查询都会产生正确的结果;您的sql可能很有用,但如果有一些上下文,您的答案会更好;例如,您可以解释这个建议的查询如何以及为什么能够解决提问者的问题。这将使它对他们更有用,对其他正在寻找类似问题解决方案的网站读者也更有用。如果记录没有按时间的升序添加到数据库中,它将无法正常工作。这不是一个在网络并发环境中的异常情况,抱歉,这个答案是指过时的问题