1

我有一个具有以下架构的表:

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?)

感谢任何可以提供帮助的人。

4

1 回答 1

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)
于 2013-09-02T16:26:15.260 回答