Indovinando dalla tua query c'è anche order_id
campo nel tuo order_products
tabella che non hai menzionato nella definizione della tabella. La tua query dovrebbe quindi essere simile a:
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
Il tuo schema db è piuttosto strano, però, la tabella degli ordini sembra che potrebbe essere rimossa e quella data spostata in order_products, perché per ogni riga order_products hai riferimento alla tabella degli ordini. Di solito è il contrario:ci sono molti ordini per ogni prodotto a cui fa riferimento il campo product_id nella tabella degli ordini. Anche la colonna della data negli ordini è di tipo varchar, perché non date o datetime?