Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 通过自联接从表中获取最新记录_Mysql_Sql_Join_Greatest N Per Group - Fatal编程技术网

Mysql 通过自联接从表中获取最新记录

Mysql 通过自联接从表中获取最新记录,mysql,sql,join,greatest-n-per-group,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 DEFAUL

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

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?)
感谢所有能提供帮助的人。

这应该可以:

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
或:


“最新”基于
创建的
修改的
列?可能与我正在审查的内容重复。谢谢各位。这个问题是重复的。我没有意识到created可以由max语句来管理。看起来我在解释自己方面做得很糟糕,而且我需要的东西比我想象的要容易。我所需要的只是查询的内部部分,
按用户id、测试id从尝试组中选择用户id、测试id、MAX(修改的)MAX mod
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)