1

MySQL クエリについてサポートが必要です。私は3つのテーブルを持っています:

`product_category` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
PRIMARY KEY  (`id`)
);

`order_products` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `qty` int(11) NOT NULL,
  `unit_price` decimal(11,2) NOT NULL,
  `category` int(11) NOT NULL,
  `order_id` int (11) NOT NULL,
   PRIMARY KEY  (`id`)
);

`orders` (
  `id` int(11) NOT NULL auto_increment,
  `date` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
 );

製品カテゴリ (特定の日付範囲) ごとにすべての注文の小計を計算するクエリがありました。次のように見えました。

 SELECT 
   SUM(op.unit_price * op.qty) as amt, 
   c.name as category_name 
 FROM 
   order_products op, 
   product_category c, 
   orders o 
 WHERE 
   op.category = c.id 
 AND 
   op.order_id = o.id
 AND
   o.date > 'xxxxxxx' 
 GROUP BY 
   c.id

これはうまく機能しますが、次のような結果が得られるように、個々の製品とその小計を各行に追加したいと思います。

c.name|amt|op.name (1) - op.subtotal (1), op.name (2), op.subtotal (2), etc....

GROUP_CONCAT を使用して、次を追加することで名前を簡単に表示できることがわかりました。

GROUP_CONCAT(op.name) as product_name

SELECT句に追加しましたが、私の人生では、各製品の小計を製品名の横に表示する方法がわかりません。GROUP_CONCAT 内にネストされた結合または CONCAT の組み合わせが関係しているように感じますが、試したことはありません。何か案は?

@piotrm には、動作するように思われるアイデアがありましたが (以下)、何らかの理由で次の結果が返されます。

SELECT  `subtotals` 
FROM  `product_category` 
WHERE  `c`.`category_name` =  'Fragrance'AND.`amt` =  '23164.50'AND.`subtotals` = CAST(     0x6c6f76656c696c7920454454202d203631302e30302c20466f72657665726c696c79202e313235206f7a2045445020726f6c6c657262616c6c202d20313831372e35302c20666f72657665726c696c79206361636865706f74202d2039302e30302c20666f72657665726c696c7920312f38206f756e63652070617266756d206f696c20726f6c6c657262616c6c202d20313833302e30302c20666f72657665726c696c792070657266756d696e6720626f6479206c6f74696f6e202d203938312e30302c20666f72657665726c696c7920332e34206f756e6365206561752064652070617266756d207370726179202009202d203535382e30302c20666f72657665726c696c79205363656e74656420566f746976652043616e646c65202d203132302e30302c20454450202620426f6f6b20736574202d203334332e30302c20666f72657665726c696c7920332e34206f756e6365206561752064652070617266756d207370726179202d2031363831352e3030 AS 
BINARY ) ;

元の SELECT 句から s.subtotal を取り出すとすぐに、正しい製品名が取得されます。JOIN クエリは、関連する category_id と小計を使用して製品を正しく引き出します。ここでこの混乱を作成せずに、2つをCONCATにすることはできません。他の考えはありますか?

解決

GROUP_CONCAT が文字列のコレクションを探していることを除いて、@piotrm のクエリは基本的に正しかった。したがって、最終的なクエリは次のようになります。

SELECT c.name AS category_name,
       SUM( s.subtotal ) AS amt,
       GROUP_CONCAT( CONCAT(s.name, ' - ', cast(s.subtotal as char) ) SEPARATOR ', ')                           AS subtotals
FROM 
       product_category c 
JOIN 
   (SELECT op.category, op.name, sum(op.qty*op.unit_price) AS subtotal
FROM order_products op
JOIN orders o ON o.id = op.order_id
WHERE o.date > '0'
GROUP BY op.category, op.name ) s 
ON s.category = c.id
GROUP BY c.name
4

2 に答える 2

0

クエリから推測すると、テーブル定義で言及していないテーブルにもorder_idフィールドがあります。order_productsクエリは次のようになります。

SELECT c.name AS category_name,
             SUM( s.subtotal ) AS amt,
             GROUP_CONCAT( CONCAT(s.name, ' - ', s.subtotal ) SEPARATOR ', ' ) AS subtotals
FROM 
    product_category c 
JOIN 
  ( SELECT op.category, op.name, sum(op.qty*op.unit_price) AS subtotal
    FROM order_products op
    JOIN orders o ON o.id = op.order_id
    WHERE o.date > '2012-03-31'
    GROUP BY op.category, op.name ) s 
  ON s.category = c.id
GROUP BY c.name

ただし、dbスキーマは非常に奇妙です.ordersテーブルは削除され、その日付はorder_productsに移動したように見えます.order_products行ごとにordersテーブルを参照しているためです. 通常は逆です。orders テーブルの product_id フィールドで参照されるすべての製品に多くの注文があります。また、注文の日付列は varchar 型です - 日付や日時ではないのはなぜですか?

于 2012-04-05T21:27:13.620 に答える
0

試す:

SELECT 
    SUM(op.unit_price * op.qty) as amt, 
    c.name as category_name,
    group_concat(concat(op.name, '-', op.qty, ',' , 
                 op.unit_price*op.qty) separator '|')
    ...
于 2012-04-05T19:52:54.370 に答える