Aus Ihrer Abfrage geht hervor, dass es auch order_id
gibt Feld in Ihren order_products
Tabelle, die Sie in der Tabellendefinition nicht erwähnt haben. Ihre Abfrage sollte dann wie folgt aussehen:
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
Ihr DB-Schema ist jedoch ziemlich seltsam, die Orders-Tabelle sieht so aus, als könnte sie entfernt und dieses Datum in order_products verschoben werden, da Sie für jede order_products-Zeile einen Verweis auf die Orders-Tabelle haben. Normalerweise ist es umgekehrt – es gibt viele Bestellungen für jedes Produkt, auf das durch das Feld product_id in der Tabelle „orders“ verwiesen wird. Auch die Datumsspalte in Bestellungen ist vom Typ varchar - warum nicht date oder datetime?