Đoán từ truy vấn của bạn cũng có order_id
trong order_products
của bạn bảng bạn đã không đề cập trong định nghĩa bảng. Khi đó, truy vấn của bạn sẽ giống như sau:
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
Mặc dù vậy, giản đồ db của bạn khá lạ, bảng đơn đặt hàng có vẻ như nó có thể bị xóa và ngày đó được chuyển sang order_products, vì đối với mỗi hàng order_products, bạn có tham chiếu đến bảng đơn hàng. Thông thường là theo cách khác - có nhiều đơn đặt hàng cho mọi sản phẩm được tham chiếu bởi trường product_id trong bảng đơn đặt hàng. Ngoài ra, cột ngày tháng trong đơn đặt hàng cũng thuộc loại varchar - tại sao không phải là ngày tháng hoặc ngày giờ?