我正在编写一个特别麻烦的查询。归结为:
我获得了一个结构表:
pid | tid | points
经过一次非常大的查询。
为便于解释:
pid
=问题ID tid
=团队ID points
=该团队因此问题而获得的分数。我想找到为特定pid获得最高分的球队。
我的问题有两个:
如果这是一个名为teampoints
的简单表,那么如何获得每个pid具有MAX(点数)的tid
?我试过SELECT pid, tid, MAX(points) from teampoints group by pid;
,但可以理解的是,这不起作用
我在一个相当大的查询后得到了这个结果。如果我的第一个答案涉及再次从teampoints
选择数据,有没有办法做到这一点而不必再次计算整个表格?
由于
PS:我使用的是mysql。
我的系统中有几个表,它们的相关结构是:
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表中。现在,在此设置中,我想找到对于任何给定事件(eid)已获得最大teamname
的{{1}}。
我希望这能使我的情况变得清晰。我只想问我需要知道什么。我在评论中提出了这些细节。
编辑:生成points
表的查询是:
teampoints
答案 0 :(得分:5)
单向:
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>
然后从中选出最佳得分手。
答案 1 :(得分:0)
select pid, tid, points
from teampoints tp
where not exists (
select 1
from teampoints tp1
where tp.pid = tp1.pid
and tp.points < tp1.points)
或某些......
答案 2 :(得分:0)
您可以将第一个查询的结果存储在临时表中并尝试类似这样的内容
SELECT pid, tid, points
FROM teampoints tp
INNER JOIN (
SELECT pid, points = MAX(points)
FROM teampoints
GROUP BY pid
) tp_max ON tp_max.pid = tp.pid AND tp_max.points = tp.points
请注意,当两个团队在项目中拥有相同的分数时,您将获得两倍。
如果您要发布您的查询,我们会更容易尝试优化它,而不是试图发明它。