2014-04-28 22 views
0

我有一个MySQL数据库,其中有很多高分值的游戏。我想获得最高分值的“个人最佳”入场券。在MySQL中获取最大值的条目

我发现了一个我认为可以工作的解决方案,直到我在数据库中获得更多名称,然后它返回完全不同的结果。

我迄今为止代码:

SELECT name, score, date, version, mode, custom 
FROM highscore 
WHERE score = 
    (SELECT MAX(score) 
      FROM highscore 
      WHERE name = 'jonte' && gamename = 'game1') 

对于很多价值,这实际上返回正确的值,例如:

JONTE 240 2014-04-28 02:52:33 1 0 2053  

它好工作与几百项,有的用不同名。但是,当我添加新条目并将名称换成'gabbes'时,对于新名称,我会得到多个条目的列表。我没有看到这里的逻辑,因为数据库中的条目看起来与数据中的某些差异完全相同。

JONTE 176 2014-04-28 11:03:46 1 0 63 
GABBES 176 2014-04-28 11:09:12 1 0 3087  

上面有两个条目,但有时它也可能会返回连续10-20个条目。

任何帮助?

+0

考虑提供适当的DDL(和/或sqlfiddle)与期望的结果集合在一起。 – Strawberry

+0

那么,你的桌子可以有多个条目,其分数等于最大值。这种情况下你想要的输出是什么? – Guneli

回答

1

如果你想为每个人的高分(即个人最好成绩),你可以做到这一点...

SELECT name, max(score) 
FROM highscore 
WHERE gamename = 'game1' 
GROUP BY name 

或者,您也可以做到这一点...

SELECT name, score, date, version, mode, custom 
FROM highscore h1 
WHERE score = 
    (SELECT MAX(score) 
      FROM highscore h2 
      WHERE name = h1.name && gamename = 'game1') 

注意:在您的SQL中,您的子条款缺少谓词name = h1.name

但请注意,如果第二个选项多次记录相同的高分,则同一个人将获得多行。

+0

第一个解决方案我早期做了什么,它只适用于每个名称的最高分,但如果我需要该条目的其他字段则不适用。 (例如,自定义值不是那个连接到那个分数的那个) 你的第二个解决方案似乎正在做我正在寻找的东西,所以非常感谢! – jsmars

+0

为什么这样的请求会异常缓慢?自从我做出这些更改后,请求可能需要几秒钟..我的其他请求很快就会通过。在phpMyAdmin中运行这个过程可能需要一分钟,而其他时间则需要0.0002秒。数据库有几千个条目。 – jsmars

+0

不应该花很长时间。你有名字栏的索引吗?先尝试一下。如果仍然很慢,请将索引添加到分数列中。我希望查询时间少于1秒。 – xagyg

0

由于多个条目具有相同的高分,所以返回多个条目。您可以添加LIMIT 1以获取单个条目。您可以选择使用ORDER BY条款返回哪个条目。