【问题标题】:Select top score only from MySQL database仅从 MySQL 数据库中选择最高分
【发布时间】:2014-08-21 12:24:45
【问题描述】:

我有一个 MySQL 语句,它从用户表中提取前 15 个分数。

select @rownum:=@rownum+1 'rank', driverName, teamColour, totalScore, totalTime, didTyreChange from entries p, (SELECT @rownum:=0) r WHERE totalTime > 1000 and progress = 19 order by totalScore desc, totalTime asc limit 15 

条件是,玩家必须完成所有问题(其中进度 = 19)并且最终时间必须超过 1 秒(totalTime > 1000)。该语句还将它们的排名作为变量返回 (@rownum:=@rownum+1 'rank')。

本次查询的结果如下

我现在想做的是将结果扩展为仅显示玩家的最高分。我查看了DISTINCTGROUP BY,但使用以下GROUP BY 语句得到这些结果

select @rownum:=@rownum+1 'rank', driverName, teamColour, totalScore, totalTime, didTyreChange from entries p, (SELECT @rownum:=0) r WHERE totalTime > 1000 and progress = 19 group by driverName order by totalScore desc, totalTime asc limit 15

DISTINCT 无处可去,因为我得到错误代码 1064。我都试过了

select @rownum:=@rownum+1 'rank', DISTINCT(driverName), teamColour, totalScore, totalTime, didTyreChange from entries p, (SELECT @rownum:=0) r WHERE totalTime > 1000 and progress = 19 order by totalScore desc, totalTime asc limit 15 

select DISTINCT driverName, @rownum:=@rownum+1 'rank', teamColour, totalScore, totalTime, didTyreChange from entries p, (SELECT @rownum:=0) r WHERE totalTime > 1000 and progress = 19 order by totalScore desc, totalTime asc limit 15

两者都没有提供所需的结果。我想知道是否有一种简单的方法可以在语句中实现这一点,或者在 PHP 方面做到这一点。

想要的结果L

viper         1  9810
Maverick      2 25420
Racer roasty  3 28850
.. .
...          15

换句话说,任何用户都不应该出现在结果中两次,只为每个用户显示最快的 totalTime。

在此处精简 SQLFiddle http://sqlfiddle.com/#!2/36d3dc/7(已达到 8000 个字符限制)。

【问题讨论】:

标签: php mysql


【解决方案1】:
SELECT @i:=@i+1 rank, a.*
  FROM 
     ( SELECT x.*
         FROM entries x
         JOIN (SELECT drivername, MIN(totaltime) min_totaltime FROM entries WHERE progress = 19 AND totaltime > 1000 GROUP BY drivername) y
           ON y.drivername = x.drivername
          AND y.min_totaltime = x.totaltime
     ) a
     , (SELECT @i:=0) i
 ORDER 
    BY totalScore desc, totalTime asc;

http://sqlfiddle.com/#!2/36d3dc/17

【讨论】:

  • 这是在排序之前将排名应用于记录集,因此排名实际上是不正确的。将此应用于完整数据集时,viper 排名第 139 位。
【解决方案2】:

如果我正确理解了您的问题,那么以下查询将对您有所帮助:

select *,@rownum:=@rownum+1 as 'rank' from (select * from (select  driverName, teamColour, totalScore, totalTime, didTyreChange from entries p WHERE totalTime > 1000 and progress = 19 order by totalScore desc, totalTime asc  )a group by driverName)c , (select @rownum:=0)f

【讨论】:

  • @PeteSimmons。如果你要使用邪恶之星(你不应该),它必须先使用。
  • @Strawberry 是的,想像瘟疫一样避免这种情况!正如我在原始声明中所说的那样
  • @pete 我已经更新了我的查询,现在试试。如果你可以在 sqlfiddle 中加载你的数据,那就太好了,然后我可以在发布之前测试我的查询
【解决方案3】:

应该这样做:

select @rownum:=@rownum+1 'rank', driverName, totalScore, MIN(totalTime) 
from entries p, (SELECT @rownum:=0) r 
WHERE totalTime > 1000 and progress = 19 
group by driverName 
order by totalScore desc, totalTime asc 

http://sqlfiddle.com/#!2/36d3dc/20/0

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多