0

運動競技の結果を追跡するデータベースにクエリを書き込んでいます。私のデータベースにはアスリートテーブルがあります:

| 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

これまでのところ、私のクエリは結果を最速の時間に制限していますが、時間で正しくソートされていません。また、結果テーブルへの2番目の参照を追加してみました

 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

しかし、それはメモリ不足エラーを引き起こしました。結果表には 100 万を超えるエントリがあり、アスリートのエントリには 15,000 を超えるエントリがあります。したがって、グループ化されたレコードを効率的に並べ替える方法はありますか、それとも、レコード セットがループしているときに PHP スクリプトで結果を削除する必要があるのでしょうか。

4

1 に答える 1

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 |

SQLフィドル

于 2013-05-14T04:31:27.220 に答える