我有一个顶级列表,它只在列表中显示一次用户。我有一个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 username point date gametime
1221 John 474 2015-10-04 253
1423 John 726 2015-10-04 386
因此,如果查询工作正常,它将返回第二行(726点)但不幸的是,它返回第一行(474点)。
我希望有人可以帮助我。
答案 0 :(得分:1)
在与其他答案类似的查询中,我开始查询那些具有最高点,有序并限制在前100位的用户。从中,加入回到MATCHED用户的原始表并指向值。这应该只返回前100名用户的每人一条记录...例外情况是,如果一个用户有多个最高点值的记录...例如John 793和John 793,因为两个不同的记录存在不同的ID。 / p>
为了解决您的多个常见问题,我将查询嵌套了一层。内部查询得到前100名...然后加入到game_toplist然后使用MINIMUM" ID"有资格获得该用户最高点的游戏(如果场景中存在多个)。这最终再次重新加入到完整的game_toplist表中,但这次是在用户名和第一个具有最高点资格的游戏上。这应该可以解决每个人的重复问题。
if(tokens.length > 3) {
tokens = line.split(":");
hours =Integer.parseInt(tokens[3].trim());
minutes =Integer.parseInt(tokens[4].trim());
}
答案 1 :(得分:0)
首先,您应该删除在子查询中不起作用的第一个order by point desc
。
你不需要内在选择既不是因为你没有改变或计算任何东西
除非您需要GROUP BY username
或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;