0

mysql DB 呼び出しから次の結果セットがあるとします (基本的な例では、main にはさらに多くのデータがあります)。

customerID   |   name     |     item     |     price
====================================================
11111        |   John     |    pizza     |   10.00
11111        |   John     |    burger    |   5.00
11111        |   John     |    drink     |   2.00
22222        |   Mike     |    lasagna   |   11.00
22222        |   Mike     |    drink     |   2.00
33333        |   Sam      |    burger    |   5.00
33333        |   Sam      |    fries     |   3.00
33333        |   Sam      |    shake     |   5.00
33333        |   Sam      |    drink     |   2.00

結果を表形式で表示したいが、customerID と name が表示される回数を制限し、各顧客ごとに小計を表示したい:

customerID   |    name    |   item    |    price
===================================================
11111        |    John    |  pizza    |   10.00
             |            |  burger   |   5.00
             |            |  drink    |   2.00
             |            |           |   **17.00**
             |            |           |
22222        |    Mike    |  lasagna  |   11.00
             |            |  drink    |   2.00
             |            |           |   **13.00**
             |            |           |
33333        |    Sam     |  burger   |   5.00
             |            |  fries    |   3.00
             |            |  shake    |   5.00
             |            |  drink    |   2.00
             |            |           |   **15.00**

複数の DB 呼び出しを実行できることはわかっていますが、1 回で実行できる場合、これは無駄です。表 1 の結果セットを循環し、表 2 に示すように PHP を使用して適切にフォーマットするのに問題があります

4

4 に答える 4

1

これは、出力を自由に変更できるため、PHP で直接解決することをお勧めします。

したがって、基本的には(テストされていない)のようなことをします:

$res = mysql_query("SELECT costumerID, name, item, price
                    FROM orders 
                    ORDER BY customerID, item");

echo "<table id='orders'>".
      "<tr><th>Name</th>".
      "<th>Item</th>".
      "<th>Price</th></tr>";

$lastCostumer = -1;
$subTotal = 0; 
while ($row = mysql_fetch_array($res))
     {
     // New costumer
     if ($lastCostumer != $row['costumerID'])
           {
           // Write the subtotal of previous costumer, unless this is the 1st one
           if ($lastCostumer != -1)
              echo "<tr><td></td>".
                   "<td></td>".
                   "<td><b>**".$subTotal."**</b></td></tr>";

           $subTotal = 0; 
           echo "<tr><td>".$row['name']."</td>".
                "<td>".$row['item']."</td>".
                "<td>".$row['price']."</td></tr>";

           $subTotal = $subTotal + $row['price'];
           $lastCostumer = $row['costumerID'];
           }
     else // Same costumer
           {
           echo "<tr><td></td>".  // Don't write the name
                "<td>".$row['item']."</td>".
                "<td>".$row['price']."</td></tr>";

           $subTotal = $subTotal + $row['price'];
           }
     }

// Write the subtotal of last costumer
echo "<tr><td></td>".
     "<td></td>".
     "<td><b>**".$subTotal."**</b></td></tr>";

echo "</table>";
于 2012-07-23T17:08:48.780 に答える
1

group_concat() を使用してこれを実現できます。

SELECT id, name, GROUP_CONCAT(item) AS items, GROUP_CONCAT(price) AS prices, SUM(price) AS total FROM ... GROUP BY id

ここでは、アイテムと価格をカンマ区切りの文字列として取得し、別の列で合計も取得します。

group_concat は独自の順序を持​​つことができます。詳細については、http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat を参照してください

于 2012-07-23T16:51:05.553 に答える
0

単一の DB 呼び出しを行うことができます。PHP で結果をループして、それに応じてテーブルを出力するだけです。言い換えれば、これはデータベースの問題ではなく、データセットをループして HTML 要素をレンダリングする方法を決定する際の問題です。

于 2012-07-23T16:50:28.737 に答える
0

(サブ)クエリで CONCAT_WS 演算子を使用できます。シーセパレーターとしてご使用ください'<br/>'。次に、GROUP BY customerId です。ただし、CONCAT_WS の出力には 1024 文字の制限があります。

于 2012-07-23T16:52:48.887 に答える