通过自我加入从表中获取最新记录

时间:2013-09-02 16:22:42

标签: mysql sql join greatest-n-per-group

我有一个包含以下架构的表:

CREATE TABLE IF NOT EXISTS `ATTEMPTS` 
  ( 
     ID         INT NOT NULL AUTO_INCREMENT, 
     USERS_ID   INT, 
     TESTS_ID   INT, 
     SCORE      FLOAT(10, 4), 
     CREATED    DATETIME DEFAULT NULL, 
     MODIFIED   DATETIME DEFAULT NULL, 
     IS_DELETED BIT(1) DEFAULT NULL, 
     PRIMARY KEY(ID) 
  );

用户可以多次尝试进行不同的测试。我正在尝试通过最佳方式来回复每个用户的所有最新测试尝试。因此,如果用户A有两次尝试测试8而三次尝试测试17,而用户B有一次尝试测试8,那么返回的表将有3条记录:两条来自用户A,一条来自用户B.这些记录各自最多最近对每种测试类型的测试尝试。

我认为这需要自我加入,但我不确定。有没有办法使用自我加入?我不确定从表中返回我想要的最佳解决方案是什么。考虑到数据的组织,我想不出一种过滤“最新”的方法。基本上,我不确定如何构建此查询。

到目前为止,这是我的(不是工作)查询:

SELECT a.USER_ID, 
       a.TEST_ID, 
       a.SCORE, 
       a.MODIFIED 
FROM   ATTEMPTS AS a, 
       ATTEMPTS AS b 
WHERE  a.USER_ID = b.USER_ID 
       AND  (Some clause to deal with most recent?)

感谢任何能提供帮助的人。

1 个答案:

答案 0 :(得分:2)

这应该做:

SELECT A.*
FROM `attempts` A
INNER JOIN (SELECT USERS_ID, TESTS_ID, MAX(CREATED) MaxCreated
            FROM `attempts`
            GROUP BY USERS_ID, TESTS_ID) B
    ON A.USERS_ID = B.USERS_ID
    AND A.TESTS_ID = B.TESTS_ID
    AND A.CREATED = B.MaxCreated

或者:

SELECT A.*
FROM `attempts` A
WHERE EXISTS (SELECT 1
              FROM (SELECT USERS_ID, TESTS_ID, MAX(CREATED) MaxCreated
                    FROM `attempts`
                    GROUP BY USERS_ID, TESTS_ID) X
              WHERE X.USERS_ID = A.USERS_ID
              AND X.TESTS_ID = A.TESTS_ID
              AND X.MaxCreated = A.CREATED)
相关问题