根据条件从包含重复值的表中检索最大值

时间:2010-06-25 10:52:36

标签: mysql

我有一个表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但是由于分组条款。

我无法构建查询。

请帮我解决这个问题

由于

1 个答案:

答案 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表中)