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