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)