0

我有一个报告页面,显示其他报告的汇总数据。我使用过 php 和 mysqli。让我深入解释一下。

我有一个商店的网络应用程序,您可以在其中添加产品详细信息。使用这些产品详细信息,您可以生成产品的包装清单报告。根据生成的包装清单报告,我需要生成另一份包含包装清单汇总数据的报告。

以下是我的表格:

产品表:

id | name | desc_id | purity | style_no | type | duty    
1  | ABC  |   1     | 18     | TEST123  |  R   | 100    
2  | XYZ  |   2     | 14     | TEST456  |  B   | 80    
3  | DEF  |   1     | 14     | TEST122  |  R   | 80    
4  | PQR  |   1     | 18     | TEST124  |  R   | 120    
5  | HJK  |   3     | 18     | TEST134  |  B   | 300

说明表:

id | descrip     
1  | Gold Diamond Ring    
2  | Gold Diamond Pendant    
3  | Gold Diamond Earring

包装主表

id | name     
1  | pkg_1    
2  | pkg_2

包装细节表

id | pkg_id | prod_id    
1  |  1     | 1    
2  |  1     | 2    
3  |  1     | 3    
4  |  1     | 4    
5  |  1     | 5

我已经使用下面的查询来生成特定 id 的包装清单报告,它可以正常工作。

SELECT id, (SELECT descrip FROM description WHERE id = desc_id ) AS descrip, style_no, type , purity, duty FROM product WHERE id IN ( SELECT prod_id FROM packaging_list_details WHERE pkg_id =1 ) ORDER BY descrip ASC , purity ASC

显示以下结果:

id | descrip            | style_no   | type   | purity | duty
1  |Gold Diamond Ring   | TEST123    |  R     | 18     | 100
4  |Gold Diamond Ring   | TEST124    |  R     | 18     | 120
3  |Gold Diamond Ring   | TEST122    |  R     | 14     | 80
2  |Gold Diamond Pendant| TEST456    |  B     | 14     | 80
5  |Gold Diamond Earring| TEST134    |  B     | 18     | 300

现在我想要使用查询汇总上述结果的数据。像:

id | descrip            | purity | qty | duty
1  |Gold Diamond Ring   | 18     | 2   | 220
2  |Gold Diamond Ring   | 14     | 1   | 80
3  |Gold Diamond Pendant| 14     | 1   | 80
4  |Gold Diamond Earring| 18     | 1   | 300

我怎样才能做到这一点?

4

2 回答 2

2

您需要使用该GROUP_BY语句 - 有关更多信息,请参阅MySql 文档

这会将查询转换为

SELECT d.descrip, p.purity, count(p.purity) as qty, sum(p.duty)
FROM product p
  INNER JOIN Description d ON p.desc_id = d.id
  LEFT OUTER JOIN packaging_details pg on pg.prod_id = p.id

GROUP BY d.descrip, p.purity
ORDER BY d.descrip desc, p.purity desc

您也可以使用您正在使用的子选择方法,但我更喜欢使用连接。INNER JOIN将链接两个表,以便返回它们的所有记录。将返回语句OUTER JOIN中表中的所有行,并将它们与 中表中的值相匹配。LEFTRIGHT

查看完整的SQL Fiddle 示例

注意:我不确定您从哪里获得样本中的 Id 值 - 它们只是行号吗?

于 2013-03-11T11:08:18.870 回答
0

我认为您应该使用 JOIN 重写您的查询:

SELECT
  P.id
  ,D.descrip
  ,P.style_no
  ,P.type
  ,P.purity
  ,P.duty
FROM
  packaging_list_details PLD
  JOIN
  product P ON
    (P.id = PLD.prod_id)
  LEFT JOIN
  description D on
    (D.desc_id = P.id)
WHERE
  (PLID.pkg_id = 1)

这应该给你你已经拥有的相同结果。要获得总数,您可以编写一个新查询,类似于上面的:

SELECT
  P.id
  ,D.descrip
  ,P.type
  ,P.purity
  ,COUNT(p.id) as total_products
  ,SUM(P.duty) as total_duty
FROM
  packaging_list_details PLD
  JOIN
  product P ON
    (P.id = PLD.prod_id)
  LEFT JOIN
  description D on
    (D.desc_id = P.id)
WHERE
  (PLID.pkg_id = 1)
GROUP BY
  P.id
  ,D.descrip
  ,P.type
  ,P.purity

第二个查询为您提供您正在寻找的总数。

于 2013-03-11T10:58:55.130 回答