1

MySQL データベースに 2 つのテーブルがあるとします。最初の名前はproducts、2 番目はsales.

テーブルに 3 つの異なるエントリを保持させてproductsください....

+-------+-----------------+-----------+--------+
|id     | productname     | quantity  | uom    |
+-------+-----------------+-----------+--------+
|1      | water bottle    | 20        | piece  |
|2      | cable           | 200       | meter  |
|3      | soap            | 1         | piece  |
+-------+-----------------+-----------+--------+

salesまた、テーブルにいくつかの売上を入力しています-

+-------+---------------------+-----------+--------+-----------+
|id     | date                | quantity  | uom    | productid |
+-------+---------------------+-----------+--------+-----------+
|1      | 2013-06-21 09:34:00 | 20        | meter  |     2     |
|2      | 2013-06-21 10:35:00 | 100       | meter  |     2     |
|3      | 2013-06-21 11:36:00 | 1         | piece  |     3     |
+-------+---------------------+-----------+--------+-----------+

上のsalesproductidforeign keyです。それを維持するすべての販売エントリproductid。次に、外部キーに基づいて、左側のテーブルから単一のエントリを、右側のテーブルから複数のエントリを含むレポートを作成する方法を説明します。

レポートのモックアップを作成しましょう-

+-----------------+-----------+--------+---------------------+-----------+
| productname     | quantity  | uom    | date                | quantity  |
+-----------------+-----------+--------+---------------------+-----------+
| cable           | 200       | meter  | 2013-06-21 09:34:00 | 20        |
|                 |           |        | 2013-06-21 10:35:00 | 100       |
| soap            | 1         | piece  | 2013-06-21 11:36:00 | 1         |
| water bottle    | 20        | piece  |                     |           |
+-----------------+-----------+--------+---------------------+-----------+

MySQL を使用して外部キーに基づいて上記のレポートを作成することは可能ですか?

4

2 に答える 2

1

UPDATED RDBMS ではなく、結果セットからレポートをレンダリングするクライアント コードの仕事です。

を使用JOINして結果セットを作成し、選択したクライアント スクリプト言語を使用してレポートのレイアウトを作成します。

php の場合GROUP_CONCAT()は、クエリとexplode()php 側で使用すると非常に便利です。

SELECT p.productname, 
       p.quantity total_quantity, 
       p.uom, 
       GROUP_CONCAT(CONCAT(COALESCE(s.date, ''),'|',COALESCE(s.quantity, '')) ORDER BY s.date) details
  FROM products p LEFT JOIN sales s 
    ON p.id = s.productid
 GROUP BY s.productid, p.productname, p.quantity, p.uom
 ORDER BY p.productname

出力例:

| | 製品名 | TOTAL_QUANTITY | 単位 | 詳細 |
-------------------------------------------------- --------------------------------------------
| | ケーブル | 200 | メートル | 2013-06-21 09:34:00|20,2013-06-21 10:35:00|100 |
| | 石鹸 | 1 | ピース | 2013-06-21 11:36:00|1 |
| | ウォーターボトル | 20 | ピース | | | | |

これがSQLFiddle のデモです。

PDOを使用したphpコードは次のようになります

<?php
$db = new PDO('mysql:host=localhost;dbname=database_name', 'user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);


$sql = "SELECT p.productname, 
               p.quantity total_quantity, 
               p.uom, 
               GROUP_CONCAT(CONCAT(COALESCE(s.date, ''),'|',COALESCE(s.quantity, '')) ORDER BY s.date) details
          FROM products p LEFT JOIN sales s 
            ON p.id = s.productid
         GROUP BY s.productid, p.productname, p.quantity, p.uom
         ORDER BY p.productname";

$query = $db->prepare($sql);
$query->execute();
$rows = $query->fetchall(PDO::FETCH_ASSOC);

$query = null;
$db = null;
?>

<table>
    <thead>
        <tr>
            <th>Product Name</th>
            <th>Total quantity</th>
            <th>UOM</th>
            <th>Date</th>
            <th>Quantity</th>
        </tr>
    </thead>
    <tbody>
<?php
    foreach($rows as $row) {
        echo "<tr>
              <td>{$row['productname']}</td>
              <td>{$row['total_quantity']}</td>
              <td>{$row['uom']}</td>";
        $details = explode(',', $row['details']);
        $i = 1;
        foreach($details as $detail) {
            list($date, $quantity) = explode('|', $detail);
            if ($i > 1) {
                echo "<td></td><td></td><td></td>";
            }
            echo "<td>$date</td>
                  <td>$quantity</td></tr>";
            $i++;    
        }
    }
?>        
    </tbody>
</table>

どちらが結果を生み出しますか

製品名 合計数量 単位 日付 数量
ケーブル 120 メートル 2013-06-21 09:34:00 20
                                     2013-06-21 10:35:00 100
石鹸 1 個 2013-06-21 11:36:00 1
水筒 20本                               
于 2013-06-23T05:32:16.973 に答える
0

クエリの最後に結合とグループ化を使用してクエリを作成できますが、MySQLクエリの返信が行に空のフィールドを返さないことがわかっています。

    select products.productname , sales.quantity , sales.uom , sales.date , sales.quantity from sales, products where sales.product.id =  products.product.id group by products.productname , sales.date

ご覧のとおり、クエリの回答は製品名が重複していますが、他の列の値は異なります。

于 2013-06-23T05:32:16.027 に答える