不知道该如何问后续问题,但这是在参考前面的一个问题:
Fetch one row per account id from list
我正在处理的查询是:
SELECT *
FROM scores s1
WHERE accountid NOT IN (SELECT accountid FROM scores s2 WHERE s1.score < s2.score)
ORDER BY score DESC
这将选择最高分,并将结果限制为每个accountid一行;它们的最高分。
最后一个障碍是,这个查询将返回多个accountid行,这些accountid有多个最高得分的出现。因此,如果accountid 17的得分为40、75、30、75,查询将返回得分为75的两行。
是否有人可以修改此查询(或提供更好的查询)来修复此情况,并真正将其限制为每个帐户ID一行?
再次感谢!
最佳答案
如果您只对accountid和score感兴趣,那么可以使用上面paul给出的简单group by查询。
SELECT accountid, MAX(score)
FROM scores
GROUP BY accountid;
如果需要scores表中的其他属性,则可以使用如下查询从行中获取其他属性:
SELECT s1.*
FROM scores AS s1
LEFT OUTER JOIN scores AS s2 ON (s1.accountid = s2.accountid
AND s1.score < s2.score)
WHERE s2.accountid IS NULL;
但这仍然会给出多行,在您的示例中,给定的accountid有两个分数与其最大值匹配。要进一步将结果集减少为一行,例如具有最新游戏日期的行,请尝试以下操作:
SELECT s1.*
FROM scores AS s1
LEFT OUTER JOIN scores AS s2 ON (s1.accountid = s2.accountid
AND s1.score < s2.score)
LEFT OUTER JOIN scores AS s3 ON (s1.accountid = s3.accountid
AND s1.score = s3.score AND s1.gamedate < s3.gamedate)
WHERE s2.accountid IS NULL
AND s3.accountid IS NULL;
关于sql - 从列表中获取每个帐户ID一行,第2部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/131056/