高级排序mysql,对动作id进行排序

时间:2013-12-20 09:18:38

标签: mysql sql sorting

enter image description here

我需要在actionName上对此表进行排序(它是从动作表中获取的,还包含一个id)。但是,某些玩家可能没有特定actionName的任何记录,如此屏幕截图所示

enter image description here

我已经完成了让它显示第一个结果,但是我不知道如何让它排序,例如,每次kill或win,它应该总是对用户名进行分组,因为我需要结果集来显示一张桌子,但随后是顶部杀伤率最高的玩家。我还需要显示其他相应的表,而不必执行大量查询。

这是我用来完成第一个结果集的SQL

SELECT
  p.playerName,
    a.actionName,
  a.id as actionId,
    SUM(a.id) AS amount,
    pa.timestamp
FROM playeraction pa
LEFT JOIN action a ON a.id = pa.action_id
INNER JOIN player p
  ON p.id = pa.player_id
GROUP BY
  pa.player_id,
    pa.action_id
ORDER BY
  p.playerName,
  amount DESC

1 个答案:

答案 0 :(得分:0)

您可以创建一个按玩家名称分组的视图,然后在该记录的不同列中分别计算kill,win和death计数。这样你就可以为每个动作设置特定的列,如果用户有这样的动作,它就不会打扰你。列值只是0,因为没有找到记录总和。这也将解决订购问题,因为您可以按每列订购:

ORDER BY KillCount, WinCount, DeathCount

在这种情况下,如果您要创建新操作,则必须修改视图。

另外,你为什么总结a.Id?你不是指算数吗?

编辑:你也可以从Action表中选择,然后加入PlayerAction表,这样就可以为你有动作记录的每一个动作。类似的东西:

SELECT 
a.Id, a.ActionName,
p.Name,
pa.Amount, pa.TimeStamp
FROM Actions a
LEFT JOIN Players p on 1 = 1
LEFT JOIN PlayerActions pa on pa.ActionId = a.Id
GROUP BY
...
ORDER BY
...

只有这样你才需要通过某种游戏匹配ID过滤玩家。

然后可以选择在收到查询结果时计算应用程序中的实际结果。这也适用于您的查询。