mySQL选择查询不再正常工作

mySQL选择查询不再正常工作,mysql,sql,Mysql,Sql,我有一个toplist,它只显示列表中的用户一次。我有一个mySQL查询,直到昨天才正常工作。我已经将我的网站转移到另一个主机,现在这个查询不像以前那样工作 SELECT * FROM (SELECT * FROM game_toplist ORDER BY point DESC) AS my_table_tmp GROUP BY username ORDER BY point DESC LIMIT 100 问题是此查询没有返回最高分数。它根据用户的最低id返回分数。以下是我的

我有一个toplist,它只显示列表中的用户一次。我有一个mySQL查询,直到昨天才正常工作。我已经将我的网站转移到另一个主机,现在这个查询不像以前那样工作

SELECT *
FROM
  (SELECT *
   FROM game_toplist
   ORDER BY point DESC) AS my_table_tmp
GROUP BY username
ORDER BY point DESC LIMIT 100
问题是此查询没有返回最高分数。它根据用户的最低id返回分数。以下是我的数据示例:

 id  username   point     date    gametime
1221  John       474  2015-10-04    253
1423  John       726  2015-10-04    386
因此,如果查询工作正常,它将返回第二行(726点),但不幸的是,它返回第一行(474点)


我希望有人能帮助我。

首先,您应该删除在子查询中不起作用的第一个
按点描述排序

您也不需要内部选择,因为您不需要更改或计算任何内容

也可以删除
按用户名分组
,除非您需要一个聚合函数,如
MAX
COUNT

除非您的问题中缺少一些信息,否则这应该是您的查询

SELECT * 
FROM game_toplist 
order by point desc limit 100";
但也许你想要这个

SELECT *
FROM game_toplist G
INNER JOIN (
                        SELECT username, Max(point) mp
                        FROM game_toplist 
                        GROUP BY username ) As maxP
ON G.username = maxP.username
AND G.point = maxP.mp
ORDER BY G.point DESC
LIMIT 100
这可能在mySQL中工作,但这不是ANSI SQL标准

    SELECT  id,  username,   MAX(point) ,    date
    FROM game_toplist
    GROUP BY username
    ORDER BY point DESC
    LIMIT 100;

在一个与其他答案类似的查询中,我首先查询的是那些得分最高的用户,排序并限制在前100名。然后,将匹配的用户和点值连接回原始表。对于排名前100位的用户,每人只能返回一条记录。。。如果一个用户有多条最高点记录,则例外。。。例如,John 793和John 793作为两个不同的记录,以不同的ID存档

为了解决多个公共时间的问题,我将查询嵌套了更深一层。内部查询将获得前100名人员。。。然后,加入游戏顶级列表将使用符合该用户最高点资格的游戏最低“ID”(如果场景中存在多个)。这是最终重新加入到完整的game_toplist表,但这一次是在用户名和第一个获得最高积分的游戏上。这将解决您的每人重复的问题

select
      gtl3.*
   from
      SELECT
            gtl2.username,
            min( gtl2.id ) as FirstGameTimeIDWithCommonHighPoint
         from
            ( select
                    gtl.username,
                    MAX( gtl.point ) as highestPointPerUser
                 from
                    game_toplist gtl
                 group by
                    gtl.username
                 order by 
                  MAX( gtl.point ) DESC
                 limit 100 ) as Top100
              JOIN game_toplist gtl2
                 ON Top100.username = gtl2.username
                 AND Top100.highestPointPerUser = gtl2.point ) as SinglePerUser
         join game_toplist gtl3
            on SinglePerUser.username = gtl3.username
           AND SinglePerUser.FirstGameTimeIDWithCommonHighPoint = gtl3.ID
   order by
      gtl3.point DESC

game\u toplist
表中显示一些示例数据会有所帮助。上面有一个样本。您可以在帖子中看到我的示例数据。问题是相同的用户名映射到不同的id。您看到的结果是正确的。id是
AUTO_INCREMENT
。您好,谢谢您的回复。我尝试了您的查询,但它在列表中多次显示用户。我需要一个只列出一次相同用户名的查询。这就是为什么我使用了
groupby
。那么您的起始查询已经错了。你的数据库是mysql?如果这不能解决你的问题,那么你问错了问题。您应该提供示例数据并期望输出,这样我们就可以处理一些问题,否则我们将猜测您需要什么。我已经试过了,但它不是按point desc排序的。同样,也多次列出相同的用户。嗨。谢谢你的帮助。我已经尝试过了,但它给了我一个白色的屏幕。@Antee86,唯一的方法是如果表中有重复的“username”值,因为内部预查询保证唯一的“username”值的限制为100。因此,当加入到game_toplist表时,重复的名称将只显示为我所说的。。。同一个人拥有前100个分值,而且分数都是一样的。是的,你是对的!我如何处理这个问题?我需要在查询中选择一个值,如果特定用户有相同的点。在我的game_toplist表中有另一个字段叫做:“gametime”。在此字段中,以秒为单位显示用户的游戏时间。因此,如果查询可以在重复值之间选择最低的游戏时间,那就太好了。我们很快就可以解决这个问题了…@Antee86,请参阅修改后的答案和更新后的查询,以限制只有一个共同的最高点条目,以便按照您的要求最早获取。我已经尝试了此代码,但没有显示任何内容。无论如何,我接受你的回答,你帮了我很多!谢谢