2013-03-11 66 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