我有一个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(取决于类别)值。我不知道从哪里开始。我发现了类似的问题,但没有一个能够将值放在别名中,因此我不必更改其他代码。
有人可以帮助我,并为至少两个类别编写示例查询,这样我就能理解这样做的原则吗?
提前谢谢!
答案 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
来捕获您想要的所有信息