1

假设,我在 MySQL 数据库中有两个表。第一个名为products,第二个是sales.

让我为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     |
+-------+---------------------+-----------+--------+-----------+

在上sales表中productidforeign 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

更新 这是客户端代码的工作,它从结果集中呈现您的报告,而不是 RDBMS。

用于JOIN生成结果集,然后根据需要使用您选择的客户端脚本语言构建报表布局。

GROUP_CONCAT()如果它是 php,您可能会发现在查询和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 |
| 水瓶| 高分辨率照片| CLIPARTO 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>

这将产生结果

产品名称 总量 UOM 日期 数量
电缆 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

您可以在查询结束时使用 join 和 group by 进行查询,但据我所知,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 回答