0

従業員のログ記録 (稼いだ金額など) を保存するログと、各従業員 ID でグループ化されたテーブルにデータを分割するコードがあります。

Empid: 0001
---------------------------
| Logid   | Hours   | Pay |
---------------------------
|  1001   | 10      | 50  |
---------------------------
|  1002   | 2       | 10  |
---------------------------

Empid: 0003
---------------------------
| Logid   | Hours   | Pay |
---------------------------
|  1003   | 3       | 9   |
---------------------------
|  1004   | 6       | 18  |
---------------------------

これは、次の半疑似コードで管理しました。

$query = mysql_query("SELECT * FROM `log` ORDER BY empid");
$id = 0;

while ($list = mysql_fetch_assoc($query)) {
    if ($id != $list['logid']) {
          create header (Logid, Hours, Pay)
          $id = $list['logid'];
          }
    add each data row for the empid
}

しかし今、Pay 列の合計を追加し、それを各 empid の各テーブルの一番下に配置したいと思います。

コード $total_pay = $total_pay + $list['pay'] を while ループに入れることで、合計支払いを取得できますが、下部に合計を表示する方法がわかりません。

これに関するアドバイスをいただければ幸いです。

4

2 に答える 2

3

これでうまくいくはずです。基本的に、IDが変更されるまで合計します。

$sum = 0;
while ($list = mysql_fetch_assoc($query)) {    
    if ($id != $list['logid']) {
          //create the totals using $sum !!!
          // after that re-set sum to 0
          $sum = 0;
          //create header (Logid, Hours, Pay)
          $id = $list['logid'];
    }
    $sum += $list['Pay'];
    //add each data row for the empid
}

また...

mysql_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に非推奨です赤いボックスがか? 代わりにプリペアド ステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事はどちらを使用するかを決めるのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。

于 2013-02-22T13:20:52.560 に答える
2

これを行うには 2 つの方法があります。

PHP

すべての「支払い」値の現在の合計を保持し、それを表の一番下に追加します。例えば:

$i=0;
while ($list = mysql_fetch_assoc($query)) {   // for each row in your results
    if ($id != $list['EmployeeId']) {  // We only enter this loop if the EmployeeId doesn't equal $id. This can happen because either $id doesn't exist yet, or it doesn't match the previous EmployeeId
          $i++;  // increase $i by 1
          if($i>1) {  // Enter this loop only if $i is greater than or equal to 2 (if it is less than two, then this is our first time running this script, and adding a footer row wouldn't make any sense).
              create footer (EmployeeId, Hours, Pay);  // Log Id is irrelevant here
          }
          //  reset your variables here
          $id = $list['EmployeeId'];  // set $id = the first or the new Employee ID
          $total_pay = $list['pay'];  // This is our first time for this Employee, so don't just add it to the running total
          create header (EmployeeId, Hours, Pay) // Create the top half of your table
    } else {  // The EmployeeId has been established: we only need to change the running total
          $total_pay = $total_pay + $list['pay'];
    }
    //  add a data row for each LogId. This executes every time we go through the loop
    create_normal_row(LogId, EmployeeId, Hours, Pay)
}

// At this point, both Employees have a header, and all data rows. However, we left the loop before we could add the last Employee's footer row
// Let's add one more footer row for the last user
create_footer (Logid, Hours, Pay);

SQL

MySQL には、実行しようとしている と非常によく似た機能を実行する関数がありますROLLUP。詳細については、こちらをご覧ください。

http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

基本的に、クエリを次のように変更します。

SELECT LogId, EmployeeId, SUM(Hours), SUM(Pay) FROM `log` 
GROUP BY empid, logid WITH ROLLUP

このクエリは、次のようなデータセットを返します。

---------------------------------------
| Logid   | EmployeeId| Hours   | Pay |
---------------------------------------
|  1001   | 1         | 10      | 50  |
---------------------------------------
|  1002   | 1         | 2       | 10  |
---------------------------------------
|  NULL   | 1         | 12      | 60  |
---------------------------------------
|  1003   | 2         | 3       | 9   |
---------------------------------------
|  1004   | 2         | 6       | 18  |
---------------------------------------
|  NULL   | 2         | 9       | 27  |
---------------------------------------
|  NULL   | NULL      | 21      | 87  |
---------------------------------------

が null の場合は常に$list['Logid']、「合計」行があることがわかります。ただし、これにより、データセットの下部に「全従業員の合計」行が追加されることに注意してください。が null の場合$list['EmployeeId']、この「合計」行にいることがわかります。


関連するメモ (これがあなたが求めているものかどうかはわかりません) では、HTML<table>要素を使用して表にこのようなものを表示できます。

各行は次のようになります。

<table> <!-- shown at the beginning of each table -->
<tr> <!-- shown at the beginning of each row -->
<td> <!-- shown at the beginning of each table cell -->
Your text goes here
</td> <!-- shown at the end of each table cell -->
<td>
More text can go here
</td>
</tr> <!-- shown at the end  of each row -->
</table> <!-- shown at the end of each table -->

<tr>s は各 内で無期限に繰り返すことができ<table><td>s は s 内で繰り返すことができます<tr>

于 2013-02-22T13:37:00.207 に答える