mysql - 最简单的 "return highscores"使用 userID 的 SQL 查询

标签 mysql greatest-n-per-group

那里高

在 Android 上玩一个最小的游戏时,我在 sql 查询方面迷失了方向。

我正在尝试获得前 100 名的排名列表,它几乎有效但不太有效

我正在使用这个查询

$sql = "SELECT * FROM WorldGames_table GROUP BY user_id ORDER BY score DESC LIMIT 100";

问题是它返回前 100 个分数的列表,顺序正确并且每个用户只包含 1 个分数。但显示的并不总是用户的最佳分数。

我对复杂查询的“组织”方式感到完全困惑,这就是我寻找简单查询的原因

干杯

更新:已解决(或者我当时认为 :s)

这是返回我正在寻找的内容的行:D

SELECT WorldGames_table .*, MAX(score) as score FROM WorldGames_table GROUP BY id, device_id ORDER BY score DESC LIMIT 100;

感谢 AT-2016 和每一位伸出援手的人 :D

UPDATE II:毕竟没有解决:S

很高兴正确的高分出现在排名中,我没有意识到,实际上,通过这个查询每个用户的所有分数都显示,而不是只返回每个用户的最佳分数。 我又来了,在搜索最简单的“返回高分” SQL 查询使用 userID

更新 III:我认为答案可能来自 this place 所以我把它放在一起,再次,它在我的本地测试中工作,但在我的服务器上应用它时失败

SELECT a.id, a.timestamp, a.name, a.score, a.color, a.flower, a.user_id

FROM games_table a

INNER JOIN (

    SELECT id, MAX(score) score
    FROM games_table
    GROUP BY user_id

) b ON a.id = b.id AND a.score = b.score

ORDER BY a.score DESC

LIMIT 100 

仍在调查,piñata 方式 ;)

更新 IV:我想我有它(但我不会在我确定之前完成) 与此同时,这就是我发现的。不,又一次失败的尝试 :(

我直接在 PHPmyAdmin 中尝试了我的查询

发现那个查询

SELECT
timestamp, name, MAX(score), color, flower, device_id 

FROM
 WorldFlowers_table 

GROUP BY 
 device_id 

ORDER BY
 score 
 DESC 

LIMIT 100;

返回了如下错误信息: “当前选择不包含唯一列。网格编辑、复选框、编辑、复制和删除功能不可用。”

所以我在第 2 行的开头添加了“id”

现在看来我得到了我想要的结果 我做了一些测试,但我会确保将问题标记为“已回答”

没有用,现在我正在看 this thread 没有太大希望

我今天唯一的收获是我直接在 phpmyadmin 中测试查询

如果外面有人救命!

更新 V:一个叫 scaisEdge 的人给了我这个答案,至少到现在为止,它似乎有效。等待更多测试说“已回答”

  select * from WorldFlowers_table
  where  (device_id, score) in (  select device_id, max(score) 
                                  FROM WorldFlowers_table 
                                  GROUP BY device_id  
                                  ORDER BY score DESC 
                                  )
  ORDER BY score DESC 
  LIMIT 100 

更新六

有效!! :)

就像我上面说的,答案是 scaisEdge 在我发布在这里的这个问题的另一个“实例”中给我的 mySQL "get TOP 100 scores" query is turning me crazy

最佳答案

尝试使用 MAX() 获得最高值:

SELECT MAX(Values) FROM WorldGames_table 
GROUP BY user_id ORDER BY score DESC LIMIT 100

尝试以下操作:

SELECT *
FROM Table JOIN
    (SELECT MIN(Score) as Values -- Or use MAX()
      FROM (SELECT Score
            FROM Table
            ORDER BY Score
            LIMIT 100
           ) Table2
    ) Table2
ON Table.Score >= Table2;

关于mysql - 最简单的 "return highscores"使用 userID 的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39789596/

相关文章:

mysql - 获取MYSQL中多个用户的时间戳之前的最后结果

mysql - 我可以合并最新和最旧行的数据吗?

mysql - 根据命令显示特定输出 MYSQL

mysql - 删除行: No Single Member Has More Than x Records

mysql - 如何使用自连接选择最小值和最大值

mysql - 如何将一个列中的所有值与另一个表中的列相乘?

mysql - 如何使用MySQL高效同步多个客户端之间的数据?

php - 选择与下拉列表中显示的值不同的值。 (PHP 和 MySQL)

java - PlayFramework 和在 MySQL 数据库中搜索波斯语单词

过程参数的 MySql 语法错误