Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Eins-zu-Viele-Beziehung:GROUP_CONCAT oder JOIN oder beides?

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?