2013-03-08 137 views
-1

我有一个测试人们提交它,然后他们用来完成测试的秒数也被提交。SQL查询没有排序正确

这是查询:

SELECT * 
FROM namethatchampion_stats 
GROUP BY user 
ORDER BY seconds ASC 
LIMIT 100 

这是表结构:

id | user | seconds | time 

我希望我的用户能够提交测试很多次,但此只列出他第一次提交。因此,如果用户获得更好的时间,他发布的秒数不会在数据库中使用该行,则只会使用用户发布的第一行。

+0

你想要每个学生的最高分数吗?或者第一个?还是最后一个提交? – 2013-03-08 13:19:56

+0

秒列保存的数据和时间列保存的数据是什么? – Eugene 2013-03-08 13:21:44

+0

我无法理解,mysql开发网站上有太多例子...太难以谷歌了吗? – 2013-03-08 13:23:08

回答

0

您的ORDER BY声明应使用包含提交测试日期的time列,而不是seconds。 (假设它包含一个完整的日期,如果只是时间,那么这个时间会从窗口中消失)。

0

这将让你为每个用户在最快的时间:你想要什么

SELECT user, MIN(seconds) 
FROM namethatchampion_stats 
GROUP BY user 
LIMIT 100; 

是这样吗?

1

我想,你希望每一个学生的成绩最好 - 这是“最好的”游敏MIN(seconds)。如果这是你想要的,这里是这样的:

SELECT user, MIN(seconds) AS best_score 
FROM namethatchampion_stats 
GROUP BY user 
ORDER BY best_score ASC 
    LIMIT 100 ; 
2

我会建议,以避免由MySQL在可能情况下提供的隐含的分组,我的意思是,你的查询已允许您选择IDTimeseconds即使它们不包含在聚合函数或group by子句中。

在此声明:

SELECT * 
FROM namethatchampion_stats 
GROUP BY User 
ORDER BY Seconds 

您是说给我一个行(随机),为每个用户,然后按秒订购这些随机行中,所以即使你有顺序的,这不影响分组:

MySQL Docs状态

该服务器是可以自由选择从每个组中的任何值,所以,除非它们是相同的,所选择的值是不确定的。此外,每个组的值的选择不能通过添加ORDER BY子句来影响。

因此,除非您的列从聚合中排除,并且组在功能上依赖于组中包含的列(例如主键),然后使用显式分组。在您的方案以获得所有从表中的行,你可以使用:

SELECT stat.ID, 
     stat.User, 
     stat.Seconds, 
     stat.Time 
FROM NamethatChampion_stats Stat 
     INNER JOIN 
     ( SELECT User, MIN(Seconds) AS Seconds 
      FROM NamethatChampion_stats 
      GROUP BY User 
     ) MaxStat 
      ON MaxStat.User = stat.User 
      AND MaxStat.Seconds = stat.Seconds 
ORDER BY Seconds ASC 
LIMIT 100 

Example on SQL Fiddle

上述方法的缺点是,如果一个用户拥有2条具有相同最快的时间既会被退回。它需要进一步的聚合来移除这些重复项(您可能需要通过第一次或最后一次测试以相同的分数进行限制)。