2012-12-28 180 views
1

我在MySQL數據庫中有這個表。如何編寫MySQL查詢

-----------------tests--------------- 
----athleteId----eventId----score---- 
----129907-------1----------900------ 
----129907-------2----------940------ 
----129907-------3----------927------ 
----129907-------4----------856------ 
----328992-------1----------780------ 
----328992-------2----------890------ 
----328992-------3----------936------ 
----328992-------4----------864------ 
----492561-------1----------899------ 
----492561-------2----------960------ 
----492561-------3----------840------ 
----492561-------4----------920------ 
----487422-------5----------900------ 
----487422-------6----------940------ 
----487422-------7----------927------ 
----629876-------5----------780------ 
----629876-------6----------890------ 
----629876-------7----------940------ 
----138688-------5----------899------ 
----138688-------6----------950------ 
----138688-------7----------840------ 
------------------------------------- 

我想要這個輸出。

---------------output---------------- 
----eventId----athleteId----score---- 
----1----------129907-------900------ 
----2----------492561-------960------ 
----3----------328992-------936------ 
----4----------//////-------///------ 
----5----------487422-------900------ 
----6----------138688-------950------ 
----7----------629876-------940------ 

我們部分解決了這個查詢的問題,但我想每個eventId只有一個不同的運動員id。目前,如果兩項賽事的最佳成績是由同一名運動員完成的,該運動員將在輸出中出現兩次。如果發生這種情況,我需要2ND最佳表現的運動員出現,而不是第一個。

縮短:一名運動員不能在結果中出現兩次。

SELECT athleteId, a.eventId, a.score 
FROM tests AS a 
JOIN (
-- This select finds the top score for each event 
SELECT eventId, MAX(score) AS score 
FROM tests 
GROUP BY eventId 
) AS b 
-- Join on the top scores 
ON a.eventId = b.eventId 
AND a.score = b.score 
+0

你是什麼問題? – Ravi

+0

看起來你有一個[標籤:最大的每組]問題。在這裏尋找一個解決方案:http://stackoverflow.com/a/7745635/570191 –

+0

@AdrianCarneiro他正在尋找每個組別不是最高的第二高。 –

回答

1

以下是如何在調用者代碼中執行此操作的示例(本例中爲PHP)。

使用查詢:

SELECT athleteId, eventId, score 
FROM tests 
ORDER BY score DESC; 

然後使用下面的代碼來處理查詢的結果(我跳過所有的樣板進行查詢):

$events = array(); // Remember events reported 
$athletes = array(); // Remember athletes listed 

while ($row = mysqli_fetch_assoc($results)) { 
    if (isset($events[$row['eventId']]) || isset($athletes[$row['athleteId']])) { 
    continue; 
    } 
    $events[$row['eventId']] = true; 
    $athletes[$row['athleteId']] = true; 
    print_row($row); 
} 
+0

我正在檢查它。將盡快報告! – djpredator17

+0

它的工作原理,謝謝。如果我需要男性/女性運動員,該怎麼辦?我應該添加一個$ sex數組嗎? – djpredator17

+0

對於每個事件中的頂級男性和女性:將'$ events'設置爲2D陣列,第二個維度爲性別。然後檢查'$ events [$ row ['eventId]] [$ row ['sex']]''。 – Barmar