2013-05-14 47 views
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 

查詢到目前爲止,我的查詢會限制結果以最快的時間,但它不是由時間正確排序。我也嘗試在結果表中添加第二個參考號

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

回答

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

+0

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

+0

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

相關問題