mysql – SQL查询中MAX()和`group by`的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – SQL查询中MAX()和`group by`的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2371字,纯文字阅读大概需要4分钟。
内容图文
![mysql – SQL查询中MAX()和`group by`的问题](/upload/InfoBanner/zyjiaocheng/907/781f300a77004d8e9fb57cf3de68989f.jpg)
我正在编写一个特别麻烦的查询.归结为:
我获得了一个结构表:
pid | tid | points
经过一个非常大的查询.
为便于说明:
> pid =问题ID
> tid =团队ID
> points =针对该问题授予该团队的积分.
我想找到为特定pid获得最高分的球队.
我的问题是双重的:
>如果这是一个名为teampoints的简单表格,我如何获得每个pid具有MAX(点数)的tid?我用pid尝试了来自teampoints group的SELECT pid,tid,MAX(points);但可以理解,那是行不通的
>经过一次相当大的查询,我得到了这个结果.如果我的第一个答案涉及再次从teampoints中选择数据,有没有办法做到这一点,而无需再次计算整个表?
谢谢
PS:我用的是mysql.
GORY DETAILS:小心谨慎
我的系统中有几个表,它们的相关结构是:
users: uid
teams: tid | eid | teamname
teammembers: tid | uid
events: eid
problems: pid | eid
submissions: subid | pid | uid | eid | points | subts
一些说明:
– 问题属于事件
– 用户属于团队
– 提交属于问题(pid)和用户(uid).提交表有一个冗余的eid字段,它总是可以从pid中确定.
用例是:
>用户组成团队.用户由uid,团队通过tid识别.团队成员存储在teammembers表中.
>用户可以提交提交,这些提交存储在提交表中.提交被授予积分. subts是提交提交时的unix时间戳.
>用户可以针对同一问题多次提交.计算最新提交的内容(最大子文件).
现在,在这个设置中,我想找到为任何给定事件(eid)获得最高分的团队名称.
我希望这能使我的情况变得清晰.我只想问我需要知道什么.我在评论中提出了这些细节.
编辑:生成teampoints表的查询是:
SELECT s.pid, teamlatest.tid, s.points
FROM submissions s, teammembers tm, teams t,
(SELECT max(maxts) AS maxts, pid, tid
FROM (SELECT latest.maxts, latest.pid, t.tid
FROM submissions s, teams t, teammembers tm,
(SELECT max(subts) AS maxts, pid, uid
FROM submissions
WHERE eid=3 AND status='P'
GROUP BY pid, uid
) AS latest
WHERE s.uid=latest.uid
AND s.pid=latest.pid
AND s.subts=latest.maxts
AND latest.uid=tm.uid
AND tm.tid=t.tid
AND t.eid=3
) AS latestbyteam
GROUP BY pid, tid) AS teamlatest
WHERE s.pid=teamlatest.pid
AND teamlatest.tid=t.tid
AND t.tid=tm.tid
AND tm.uid=s.uid
AND s.subts=teamlatest.maxts
解决方法:
>一种方式:
SELECT pid, tid, points
FROM teampoints
WHERE (pid, points) IN (
SELECT pid, MAX(points)
FROM teampoints GROUP BY pid
)
另一个,使用连接:
SELECT s1.*
FROM teampoints AS s1
LEFT JOIN teampoints AS s2
ON s1.pid = s2.pid
AND s1.points < s2.points
WHERE s2.tid IS NULL
>您可以为复杂查询提供INSERT INTO临时表:
CREATE TEMPORARY TABLE scores (
pid INT, tid INT, points INT,
KEY pp (pid, points)
);
INSERT INTO scores (pid, tid, points)
SELECT <a complex query>
然后从中选择最佳得分手.
内容总结
以上是互联网集市为您收集整理的mysql – SQL查询中MAX()和`group by`的问题全部内容,希望文章能够帮你解决mysql – SQL查询中MAX()和`group by`的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。