MySQL连接查询以创建自定义报表

MySQL连接查询以创建自定义报表,mysql,join,left-join,outer-join,Mysql,Join,Left Join,Outer Join,假设MySQL数据库中有两个表。第一个名为产品,第二个名为销售 让我为产品表保留三个不同的条目 +-------+-----------------+-----------+--------+ |id | productname | quantity | uom | +-------+-----------------+-----------+--------+ |1 | water bottle | 20 | piece | |2

假设MySQL数据库中有两个表。第一个名为
产品
,第二个名为
销售

让我为
产品
表保留三个不同的条目

+-------+-----------------+-----------+--------+
|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
表中
productid
外键
。每个销售分录都保存着
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基于外键创建上述报告?

您可以在查询结束时使用join和group by进行查询,但据我所知,MySQL查询的reply不会返回行中的空字段

    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

如您所见,查询的答案将具有重复的productname,但在其他列中具有不同的值。

您可以在查询结束时使用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

如您所见,查询的答案将具有重复的productname,但在其他列中具有不同的值。

已更新。这是一项针对客户端代码的作业,用于从结果集(不用于RDBMS)呈现报告

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

如果是php,您可能会发现在查询中使用
GROUP\u CONCAT()
,在php端使用
explode()
非常方便

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
样本输出:

| PRODUCTNAME | TOTAL_QUANTITY | UOM | DETAILS | ------------------------------------------------------------------------------------------ | 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 | | | |产品名称|总数量|计量单位|详细信息| ------------------------------------------------------------------------------------------ |电缆200米2013-06-21 09:34:00 202013-06-21 10:35:00 100| |肥皂片2013-06-21 11:36:00| |水瓶20件| 这里是演示

使用PDO的php代码可能如下所示


已更新这是一项针对客户端代码的作业,用于从结果集(不用于RDBMS)呈现报告

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

如果是php,您可能会发现在查询中使用
GROUP\u CONCAT()
,在php端使用
explode()
非常方便

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
样本输出:

| PRODUCTNAME | TOTAL_QUANTITY | UOM | DETAILS | ------------------------------------------------------------------------------------------ | 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 | | | |产品名称|总数量|计量单位|详细信息| ------------------------------------------------------------------------------------------ |电缆200米2013-06-21 09:34:00 202013-06-21 10:35:00 100| |肥皂片2013-06-21 11:36:00| |水瓶20件| 这里是演示

使用PDO的php代码可能如下所示


如果左表条目将重复,则数量也将重复。。。我说得对吗?如果这样,我将无法计算出数量中
的确切总和。如果左表条目将重复,那么数量也将重复。。。我说得对吗?如果这样,我将无法计算出
数量的确切总和
。我还需要再添加一行,该行在
产品
表中,但还没有任何销售,我可以将该行与此报告一起添加吗?@sam请参阅更新的答案。查询、sqlfiddle和php代码中的查询已经更新。我还需要再添加一行,该行在
products
表中,但还没有任何销售,我可以将该行与此报告一起添加吗?@sam请参阅更新的答案。查询、SQLFIDLE和php代码中的查询已经更新。