我有一个包含以下架构的表:
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?)
感谢任何能提供帮助的人。
答案 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)