-1

我有一个测试,人们提交它,然后他们用来完成测试的秒数也被提交。

这是查询:

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

这是表结构:

id | user | seconds | time

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

4

4 回答 4

2

我建议尽可能避免 MySQL 提供的隐式分组,我的意思是您的查询允许您选择ID,Timeseconds,即使它们不包含在聚合函数或 group by 子句中。

在本声明中:

SELECT  *
FROM    namethatchampion_stats
GROUP BY User
ORDER BY Seconds

您是说为每个用户给我一行(随机),然后按秒对这些随机行进行排序,因此即使您有排序依据,这也不会影响分组:

MySQL文档状态

服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加 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

SQL Fiddle 示例

上述方法的缺点是,如果用户有 2 条最快时间相同的记录,则两条记录都会被返回。它需要进一步聚合以删除这些重复项(您可能需要限制第一个或最后一个具有相同分数的测试)。

于 2013-03-08T13:36:50.287 回答
1

我假设你想要每个学生的最好成绩 - 并且“最好”你 min MIN(seconds)。如果这是您想要的,那么方法如下:

SELECT user, MIN(seconds) AS best_score
FROM namethatchampion_stats
GROUP BY user
ORDER BY best_score ASC
    LIMIT 100 ;
于 2013-03-08T13:22:16.910 回答
0

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

于 2013-03-08T13:19:26.753 回答
0

这将为每个用户提供最快的时间:

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

这是你想要的吗?

于 2013-03-08T13:21:59.860 回答