MySQL连接查询以创建自定义报表
假设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
产品
,第二个名为销售
让我为产品
表保留三个不同的条目
+-------+-----------------+-----------+--------+
|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代码中的查询已经更新。