2012-08-01 55 views
0

我正在從mysql數據庫中提取數據。我想添加多次跑步的長度,並根據跑得最遠的人的排名進行排序。從多行中選擇Mysql數據,算術,排序

function determineLength($db, $name){ 
     $getLength = "select length from $db where name = $name and sex = 'male'"; 
     $gettingLength = mysql_query($getLength); 
     while($gotLenth = mysql_fetch_array($gettingLength)){ 

     more code that calculates total length and returns it as $lengthAccumulator 
     } 
     return array('totalLength'=>$lengthAccumulator); 
    } 

現在,我有30個不同的男性,他們的名字永遠不會改變,我需要拉和排序。我應該如何爲沒有冗餘的每個人運行mysql代碼?我只能想出這種方式 -

$name = john; 
    $a = determineLength($db, $name); 
    $aLength = $a['totalLength']; 

    $name = sam; 
    $b = determineLength($db, $name); 
    $bLength = $b['totalLength']; 

    $name = henry; 
    $c = determineLength($db, $name); 
    $cLength = $c['totalLength']; 

    $name = ted; 
    $d = determineLength($db, $name); 
    $dLength = $d['totalLength']; 

然後存儲在$ aLength,$ bLength,$ cLength ...到一個數組中,並將它們整理出來的方式。 這似乎是錯誤的做法,更不用說多餘和緩慢。數據庫中有超過40k行數據,因此試圖以這種方式執行數據將在數據庫中超過1.2百萬次?我可以傳遞一個名稱數組到該函數中,然後在mysql代碼中使用ORDER BY長度DESC嗎?

我需要幫助。謝謝!

****the answer below by zane seemed to work to order the runners, but 

我將如何使用此方法回顯實際排名?我用他的選擇語句代替了我上面的那個,但是我怎麼去迴應一個人的等級呢?我可以將結果保存到數組中然後回顯密鑰嗎?

回答

6

如果我正確理解你的處境,你可以簡單地這樣做在一個單獨的SQL語句:

SELECT name 
FROM  $db 
GROUP BY name 
ORDER BY SUM(length) DESC 

所有的一切都已經直接從結果集進行排序。沒有程序代碼。

上面得到所有選手,但如果你希望得到一個排序組特定的男選手,你可以添加WHERE條款,像這樣:

SELECT name 
FROM  $db 
WHERE name IN ('name1', 'name2', 'name3', 'etc...') AND 
     sex = 'male' 
GROUP BY name 
ORDER BY SUM(length) DESC 

要在實際的SQL排名,你可以做:

SELECT  name, @rank:[email protected]+1 AS rank 
FROM  $db 
CROSS JOIN (SELECT @rank:=0) val_init 
WHERE  name IN ('name1', 'name2', 'name3', 'etc...') AND 
      sex = 'male' 
GROUP BY name 
ORDER BY SUM(length) DESC 

然後參考rank列在php的人的排名。

+0

謝謝你,工作。這正是我想要做的。 – 2012-08-01 06:15:51

+0

我將如何使用此方法迴應實際排名?我用這個選擇語句代替了上面的那個,但是我怎麼去迴應一個人的等級呢?我可以將結果保存到數組中然後回顯密鑰嗎? – 2012-08-03 19:23:31

+0

@ user903497,那麼最好的方法就是在php中創建一個增量變量,比如'$ i',然後在每個迭代的foreach或while循環中回顯出來,然後遞增: (即'$ i ++;')。或者,您可以在SQL中正確執行排名,正如我在上面編輯的答案中所述。 – 2012-08-03 19:34:22