通过语句对数据集进行排序
问题描述:
我正在向追踪运动竞赛结果的数据库中写入查询。我的数据库有一个运动员表:通过语句对数据集进行排序
| 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脚本在记录集合循环中移除结果。
答
尝试
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 |
你是什么意思... *它不是按时间排序正确... *?你能根据你的样本数据提供所需的输出吗? – peterm 2013-05-14 04:11:31