通过语句对数据集进行排序

问题描述:

我正在向追踪运动竞赛结果的数据库中写入查询。我的数据库有一个运动员表:通过语句对数据集进行排序

| id | first_name | last_name | Gender | 
| 1  | Sam   | Johnson  | m  | 
| 2  | Adam   | Jones  | m  | 

和成绩表

| id | time   | athlete_id 
| 1  | 1302   | 1    
| 2  | 1420   | 1    
| 3  | 1491   | 2 
| 4  | 1541   | 2 
| 5  | 0    | 1 

我想检索所有的运动员只有自己最快的结果。我有这样

select a.id as aid, a.`first`, a.`last`, r.`id` as `rid`, min(r.`time`) as `time` 
FROM athletes a, results r 
WHERE 
    r.athlete_id=a.id AND 
    r.time > 0 
GROUP BY a.id 
ORDER BY r.time 

查询到目前为止,我的查询会限制结果以最快的时间,但它不是由时间正确排序。我也尝试在结果表中添加第二个参考号

select a.id as aid, a.`first`, a.`last`, r.`id` as `rid`, r.`time` 
FROM athletes a, results r, results r2 
WHERE 
    r.athlete_id=a.id AND 
    r2.athlete_id=a.id AND 
    r.time > 0 
    r1.time < r2.time 
ORDER BY r.time 

但是这样会导致内存不足错误。成绩表拥有超过一百万的参赛作品,运动员入场人数超过15,000人。所以问题依然存在,有没有一种有效的方法来排序分组记录,或者我应该让PHP脚本在记录集合循环中移除结果。

+0

你是什么意思... *它不是按时间排序正确... *?你能根据你的样本数据提供所需的输出吗? – peterm 2013-05-14 04:11:31

尝试

SELECT q.athlete_id aid, a.first, a.last, r.id rid, q.`time` 
    FROM 
(SELECT athlete_id, MIN(`time`) `time` 
    FROM results 
WHERE time > 0 
GROUP BY athlete_id) q JOIN results r 
    ON q.athlete_id = r.athlete_id 
    AND q.`time` = r.`time` JOIN athletes a 
    ON q.q.athlete_id = a.id 
ORDER BY q.`time` 

输出:

| AID | FIRST | LAST | RID | TIME | 
-------------------------------------- 
| 1 | Sam | Johnson | 1 | 1302 | 
| 2 | Adam | Jones | 3 | 1491 | 

SQLFiddle

+0

谢谢peterm。我最终做了一些与此非常相似的事情。 – Robbert 2013-05-14 04:35:17

+0

@Robbert你很受欢迎。 – peterm 2013-05-14 04:36:08