請教該如何用group by 列出不同項目的統計表後再排名

edited 十月 2013 in PHP新手區
這段程式會列出下面的結果

$result = mysql_query("SELECT *,count(*) as c FROM `test` GROUP BY `name`, `status`");

while($data = mysql_fetch_array($result))
$status[$data][$data] = $data;

echo '<table border="1">';
echo '
<tr>
<td>姓名</td>
<td>完成</td>
<td>進行</td>
<td>未完</td>
<td>總計</td>
</tr>';
foreach($status as $key => $value) {
$value = empty($value)?0:$value;
$value = empty($value)?0:$value;
$value = empty($value)?0:$value;
echo '<tr>';
echo '<td>'.$key.'</td>';
echo '<td>'.$value.'</td>';
echo '<td>'.$value.'</td>';
echo '<td>'.$value.'</td>';
echo '<td>'.($value+$value+$value).'</td>';
echo '</tr>';
}
echo '</table>';
?>


姓名  完成  進行  未完  總計
A1   3    1    2    6
A2   1    2    0    3
A3   0    2    1    3
A4   0    2    0    2
那我在
$result = mysql_query("SELECT *,count(*) as c FROM `test` GROUP BY `name`, `status` ORDER BY 'c' DESC");
加上ORDER BY 'c' DESC 這樣出來的排名順序好像不太對,請問是哪邊有錯呢?
如果總計數相同時排名會同時有2位以上排名數相同,那有辦法解決ㄇ?
結果會像最下面的例子那樣

姓名  完成  進行  未完  總計  排名
A1   3    1    2    6    1
A2   1    2    0    3    2
A3   0    2    1    3    2
A4   0    2    0    2    3

或是像下面這樣也行

姓名  完成  進行  未完  總計  排名
A1   3    1    2    6    1
A2   1    2    0    3    2
A3   0    2    1    3    3
A4   0    2    0    2    4

主要是能列出排名,能否請高手幫忙解惑一下,謝謝!!

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=1936

評論

  • edited 八月 2006
    簡單排法
    $result = mysql_query("SELECT *,count(*) as c FROM `test` GROUP BY `name`, `status`");
    
    while($data = mysql_fetch_array($result))
        $status[$data['name']][$data['status']] = $data['c'];
    
    echo '<table border="1">';
    echo '
      <tr>
        <td>姓名</td>
        <td>完成</td>
        <td>進行</td>
        <td>未完</td>
        <td>總計</td>
        [color=FF0000]<td>排名</td>[/color]
      </tr>';
    [color=FF0000]$I = 1;[/color]
    foreach($status as $key => $value) {
        $value['完成'] = empty($value['完成'])?0:$value['完成'];
        $value['進行'] = empty($value['進行'])?0:$value['進行'];
        $value['未完'] = empty($value['未完'])?0:$value['未完'];
        echo '<tr>';
        echo '<td>'.$key.'</td>';
        echo '<td>'.$value['完成'].'</td>';
        echo '<td>'.$value['進行'].'</td>';
        echo '<td>'.$value['未完'].'</td>';
        echo '<td>'.($value['完成']+$value['進行']+$value['未完']).'</td>';
        [color=FF0000]echo '<td>'.$I.'</td>';[/color]
        echo '</tr>';
        [color=FF0000]$I++[/color]
    }
    echo '</table>';
    ?>
    
    另外像1223或1224
    希望你能自己想出解決方法
    建議思考方向 上一筆總計數量跟現在的總計數量
  • edited 八月 2006
    分開兩個階段進行,首先找出排名:

    SELECT NAME, COUNT(*) FROM TEST GROUP BY NAME

    用迴圈每次抽取一個人名,執行這一句(大意):

    SELECT STATUS, COUNT(*)
    FROM STATUS
    WHERE NAME = "$NAME"
    GROUP BY STATUS

    此外,SELECT 的欄位應該是在 GROUP BY 之中出現過的,或者是 aggregate functions,例如 COUNT(), SUM() 等,這才符合 ANSI SQL,你的用法是 MYSQL 擴展出來,想不出有甚麼用處,我唯一想到就是用來減低系統的運作效率。
Sign In or Register to comment.