MySQL SUM为多个列和组提供了前n个值

时间:2016-03-01 12:49:44

标签: mysql sum

我有一个MySQL表,其中包含几个类别(p1,p2等)和玩家ID(pid)的玩家点数。

我有一个查询计算每个类别的点数的SUM,将它们作为别名并按玩家ID(pid)对它们进行分组。

   SELECT *, 
   SUM(p1) as p1, 
   SUM(p2) as p2, 
   SUM(p3) as p3, 
   SUM(p4) as p4, 
   SUM(p6) as p6, 
   SUM(p13) as p13, 
   SUM(p14) as p14, 
   SUM(p15) as p15, 
   SUM(p16) as p16, 
   SUM(p17) as p17, 
   SUM(p18) as p18, 
   SUM(p19) as p19, 
   SUM(p20) as p20, 
   SUM(p21) as p21 
FROM results GROUP BY pid

我还做一个while循环并用这些别名值更新其他表。

现在我需要计算每组的前5或12(取决于类别)值。我不知道从哪里开始。我发现了类似的问题,但没有一个能够将值放在别名中,因此我不必更改其他代码。

有人可以帮助我,并为至少两个类别编写示例查询,这样我就能理解这样做的原则吗?

提前谢谢!

3 个答案:

答案 0 :(得分:1)

由于我们需要对前n个记录求和,我们需要使用这样的东西:

SELECT pid, sum(p1)
FROM (SELECT p.*,
             (@pn := if(@p = pid, @pn + 1,
                        if(@p := pid, 1, 1)
                       )
             ) as seqnum
      FROM player p CROSS JOIN
           (SELECT @p := 0, @pn := 0) as p1
      ORDER BY pid, p1 DESC
     ) p
WHERE seqnum <= 1
GROUP BY pid;

在这里,我们可以根据所需的记录数修改seqnum <= 1条件。例如。如果我们想要5条记录,那么我们需要写seqnum <= 5

请注意,这只会计算特定字段的前n个总和。如果我们想要多个字段,那么我们可能需要重复查询。

Here是SQL Fiddle的例子。

答案 1 :(得分:0)

在@DarshanMehta的答案的基础上,你可以做这样的重复子查询。请注意,每个子查询中的变量名称必须不同。

这样的事情,假设你有一个玩家表: -

<div class="input-group">
    <input type="text" class="form-control" aria-label="...">
    <div class="input-group-btn">
        <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            <span class="caret"></span>
        </button>
        <ul class="dropdown-menu dropdown-menu-right">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">Separated link</a></li>
        </ul>
    </div><!-- /btn-group -->

答案 2 :(得分:-1)

您可以使用所有SUM信息构建一个表,并使用此信息:

SELECT * from newTable ORDER BY p1 DESC LIMIT 5;

您可以通过更改字段 p1 LIMIT 5

来捕获您想要的所有信息