我有一个报告页面显示其他报告的汇总数据。我使用过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
我怎样才能做到这一点?
答案 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
第二个查询为您提供了您要查找的总数。