在SQL查询中出现MAX()和`group by`的问题

时间:2010-02-15 13:34:33

标签: mysql

我正在编写一个特别麻烦的查询。归结为:

我获得了一个结构表:

pid | tid | points

经过一次非常大的查询。

为便于解释:

  • pid =问题ID
  • tid =团队ID
  • points =该团队因此问题而获得的分数。

我想找到为特定pid获得最高分的球队。

我的问题有两个:

  1. 如果这是一个名为teampoints的简单表,那么如何获得每个pid具有MAX(点数)的tid?我试过SELECT pid, tid, MAX(points) from teampoints group by pid;,但可以理解的是,这不起作用

  2. 我在一个相当大的查询后得到了这个结果。如果我的第一个答案涉及再次从teampoints选择数据,有没有办法做到这一点而不必再次计算整个表格?

  3. 由于

    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)已获得最大teamname的{​​{1}}。

    我希望这能使我的情况变得清晰。我只想问我需要知道什么。我在评论中提出了这些细节。

    编辑:生成points表的查询是:

    teampoints

3 个答案:

答案 0 :(得分:5)

  1. 单向:

    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
    
  2. 您可以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

请注意,当两个团队在项目中拥有相同的分数时,您将获得两倍。

如果您要发布您的查询,我们会更容易尝试优化它,而不是试图发明它。