【问题标题】:Getting most recent record from table via self join通过自连接从表中获取最新记录
【发布时间】:2013-09-05 19:20:16
【问题描述】:

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

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。这些记录分别是最最近对每种测试类型进行的测试尝试。

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

到目前为止,这是我的 (NOT YET WORKING) 查询:

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

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

【问题讨论】:

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


【解决方案1】:

应该这样做:

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)

【讨论】:

  • 看来我在解释自己方面做得不好,而且我需要的东西比我想象的要容易。我所需要的只是您查询的内部部分,SELECT user_id, test_id, MAX(modified) max_mod FROM attempts GROUP BY user_id, test_id
猜你喜欢
  • 2019-07-16
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2021-10-27
  • 2011-12-25
  • 2018-07-11
相关资源
最近更新 更多