我有一个表tbl_usertests,我想从中检索每个测试都有最大测试核心的用户。
注意:此处的用户表示usertestid是唯一的。
它的名字是:
pk_usertestid attemptdate uploaddate fk_tbl_tests_testid fk_tbl_users_userid testscore totalquestionsnotattempted totalquestionscorrect totalquestionsincorrect totalquestions timetaken iscurrent
数据:
1;NULL;"2010-06-24 22:48:07";"11";"3";"1";"53";"1";"21";"75";"92";"1"
2;NULL;"2010-06-25 01:21:37";"11";"4";"13";"0";"13";"62";"75";"801";"1"
3;NULL;"2010-06-25 01:21:50";"10";"4";"17";"5";"17";"53";"75";"640";"1"
4;NULL;"2010-06-25 01:24:23";"11";"4";"13";"0";"13";"62";"75";"801";"1"
5;NULL;"2010-06-25 01:24:47";"10";"4";"17";"5";"17";"53";"75";"640";"1"
6;NULL;"2010-06-25 01:36:04";"11";"5";"13";"0";"13";"62";"75";"801";"1"
7;NULL;"2010-06-25 01:47:26";"7";"5";"10";"1";"10";"49";"60";"302";"1"
我的查询是:
SELECT max(`testscore`) , `fk_tbl_tests_testid` , `fk_tbl_users_userid` , `pk_usertestid`
FROM `tbl_usertests`
GROUP BY `fk_tbl_tests_testid`
此查询输出:
max(`testscore`) fk_tbl_tests_testid fk_tbl_users_userid pk_usertestid
10 7 5 7
17 10 4 3
13 11 3 1
但问题是,如果有两个用户具有相同的分数,则只显示一个用户,因为我使用了group by子句。
有关。例如testid = 10我有两条记录(pk_usertestid 3和5)但它只显示3条。
我希望上传日期小于其他用户的用户(如果两个用户具有相同的testcore)。它应显示usertestid = 3,因为3上传日期小于5。 现在它显示3但是由于分组条款。
我无法构建查询。
请帮我解决这个问题
由于
答案 0 :(得分:0)
试试这个:
SELECT t.`fk_tbl_tests_testid` , t.`fk_tbl_users_userid` , t.`pk_usertestid`, maxscores.maxscore
FROM `tbl_usertests` t
JOIN (SELECT `fk_tbl_tests_testid`,max(`testscore`) as maxscore
FROM `tbl_usertests`
GROUP BY `fk_tbl_tests_testid`) maxscores ON t.`fk_tbl_tests_testid` = maxscores.`fk_tbl_tests_testid`
背后的逻辑是将整个事物分成两部分:获取每个组的最大值(或任何其他聚合值)(这是子查询部分),然后对于每个元素,加入相应的聚合。 (将其加入到riginal表中)