使用group by语句对数据集进行排序

时间:2013-05-14 03:48:13

标签: mysql group-by

我正在向追踪体育比赛结果的数据库写一个查询。我的数据库有一个运动员表:

| 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脚本在记录集循环时删除结果。

1 个答案:

答案 0 :(得分:1)

尝试

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