0

mysql DB からデータを取得しています。複数回の走行距離を加算して、最も長く走った人の順位で並べ替えたいと思います。

    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... を配列に格納し、そのように並べ替えます。冗長で遅いことは言うまでもなく、それは間違った方法のように思えます。DB には 40,000 行を超えるデータがあるため、この方法で実行しようとすると、DB を 120 万回以上実行することになります。名前の配列を関数に渡してから、mysql コードで ORDER BY length DESC を使用できますか?

助けが必要です。ありがとう!

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

この方法を使用して実際のランクをエコーするにはどうすればよいですか? 彼の選択ステートメントを上記のステートメントに置き換えましたが、人のランクをエコーするにはどうすればよいでしょうか? 結果を配列に保存してから、キーをエコーできますか?

4

1 に答える 1

6

私があなたの状況を正しく理解していれば、これを1つの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:=@rank+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の列を参照します。

于 2012-08-01T05:52:13.120 に答える