0

我正在从 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... 存储到一个数组中并以这种方式对它们进行排序。这似乎是错误的做法,更不用说冗余和缓慢了。数据库中有超过 40,000 行数据,因此尝试以这种方式执行此操作会在数据库中运行超过 120 万次?!我可以将名称数组传递给函数,然后在 mysql 代码中使用 ORDER BY length DESC 吗?

我需要帮助。谢谢你!

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

我将如何使用这种方法呼应实际排名?我已将他的选择声明替换为我上面的声明,但我将如何回应一个人的等级?我可以将结果保存到数组中然后回显密钥吗?

4

1 回答 1

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:=@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

然后参考rankphp 中的列以获取该人的排名。

于 2012-08-01T05:52:13.120 回答