2012-05-01 84 views
3

问题
我有四个游戏服务器正在收集数据。将数据放入单个表中。不幸的是,这会导致一名球员的每个数据有四项。SQL查询:在一个语句中使用DISTINCT/UNIQUE和SUM()

我想要什么
我想在某些列上有一条记录和SUM()。

我会发表一条我写的声明不起作用,但您会明白我想完成的事情。

SELECT DISTINCT(Name), 
       Max(Level), 
       Class, 
       Sum(Kills), 
       Sum(Deaths), 
       Sum(Points), 
       Sum(TotalTime), 
       Sum(TotalVisits), 
       CharacterID 
FROM Characters 
WHERE Name LIKE '$value%' 
     OR CharacterID LIKE '$value' 
ORDER BY Name ASC; 
+2

重复行通常表示系统架构存在问题。您可能想重新考虑如何处理并行服务器。 –

回答

5

让我开始说,数据库中的重复行真的不太理想。数据库使数据更易于操作,而不会随机出现异常情况。

但是,为了回答你的问题,这简直是什么dweiss所说的投入代码(使用group by):

SELECT 
    name, 
    MAX(Level), 
    Class, 
    SUM(Kills), 
    SUM(Deaths), 
    SUM(Points), 
    SUM(TotalTime), 
    SUM(TotalVisits), 
    CharacterID 
FROM 
    Characters 
WHERE 
    Name LIKE '$value%' OR CharacterID LIKE '$value' 
GROUP BY 
    name, 
    class, 
    characterid 
ORDER BY 
    Name ASC 
; 

我假设姓名,班级,或CharacterId,都是每个球员一样,因为那是获得那些价值的唯一方法。否则,你也必须在它们上使用聚合函数。

+2

谢谢,我承认StackedOverflow的风格愚蠢。 OP - Tim在这里绝对是正确的,指出规范化的数据库将使事情变得更容易,几乎总是更加优化。目前,Tim写的查询应该没有任何缺陷,但是你可能想了解更多关于SQL的内容,并且可能花费一些时间绘制出一个模式 - 这对确保有帮助。 – dweiss

+0

该查询的作品,伟大的家伙赞赏和感谢的经验教训。我现在面临的问题是查询适用于phpmyadmin,但在网页上......我第一次碰到这个,任何经验,将不胜感激。 – Andrew

+0

@Andrew我不确定。如果你打开一个新的StackOverflow问题并且完整地解释你的问题,这可能是最好的。 –

5

而不是使用不同的,你可以通过你的非汇总资料栏组(即姓名,班级,或CharacterId)。这样你就可以使用你的聚合:最大值,总和,你仍然会有你独特的角色!

+0

我会给你投票,但我需要15个代表:) 谢谢! – Andrew

+0

谢谢!使用Tim在上面写出的查询,但请考虑他和我的意见。 – dweiss

+0

@ user1366982此外,如果您发现dweiss的回答最有用,您可以通过点击绿色复选标记给他接受的答案。 –