2013-03-11 28 views
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 

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 

我用下面的查询来生成特定标识的包装清单报告,其中正常工作。

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 FROMpackaging_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 

使用上面的查询结果,现在我想总结的数据。 Like:

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

这实际上与PHP没有任何关系。它是SQL和MySQLi。 – 2013-03-11 10:58:11

回答

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的值 - 他们只是行数?

+0

感谢您的回答,这与我所需的结果几乎相同,但数量不足。 – pkachhia 2013-03-11 11:11:28

+0

是,行号,主字段,自动增量。 – pkachhia 2013-03-11 11:13:22

+0

@pkachhia已更新为包含数量。行号不是主要字段,不应将其视为索引,因为每个查询都可以更改。 – Kami 2013-03-11 11:15:04

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 

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

+0

感谢您的回答,让我检查查询。 – pkachhia 2013-03-11 11:03:51

+0

我已经使用了第二个查询并进行了一些更正,但它只给出了一行,并不符合我的预期。 – pkachhia 2013-03-11 11:07:26

+0

哎呦,我忘了那群人。回答修改,现在它应该是正确的(有趣的是,MySQL允许在没有GROUP BY的情况下运行这样的查询,其他任何RDBMS都会引发错误)。 – Diego 2013-03-11 11:50:37