选择查询以计算出现次数和总成本

时间:2013-03-11 10:44:00

标签: sql mysqli

我有一个报告页面显示其他报告的汇总数据。我使用过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

packaging_master表

id | name     
1  | pkg_1    
2  | pkg_2

packging_details表

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

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

您需要使用GROUP_BY声明 - 有关详细信息,请参阅MySql docs

这会将查询转换为此类

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将返回语句LEFT上的表中的所有行,并将它们与RIGHT上的表中的值进行匹配。

查看完整的SQL Fiddle sample

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

答案 1 :(得分: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

第二个查询为您提供了您要查找的总数。