mySQL选择查询不再正常工作
我有一个toplist,它只显示列表中的用户一次。我有一个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返回分数。以下是我的
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,请参阅修改后的答案和更新后的查询,以限制只有一个共同的最高点条目,以便按照您的要求最早获取。我已经尝试了此代码,但没有显示任何内容。无论如何,我接受你的回答,你帮了我很多!谢谢