0

他のレポートの要約データを表示するレポート ページが 1 つあります。php と mysqli を使用しました。深く説明させてください。

商品の詳細を追加できるストアの Web アプリケーションがあります。これらの製品の詳細を使用して、製品のパッケージ リスト レポートを生成できます。生成された梱包リスト レポートに基づいて、梱包リストの要約データを含む別のレポートを生成する必要があります。

以下は私のテーブルです:

製品表:

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

packing_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

どうすればこれを達成できますか?

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

2 番目のクエリでは、探している合計が得られます。

于 2013-03-11T10:58:55.130 に答える