sql >> Base de Datos >  >> RDS >> Mysql

MySQL INNER JOIN de 3 tablas con conteo y totales

Dado que los pedidos están vinculados a las empresas a través de los clientes, no creo que necesite realizar dos subconsultas separadas y unirlas; más bien, creo que puedes escribir:

SELECT companies.company AS "Company",
       IFNULL(COUNT(DISTINCT companies_customers.customer_id), 0) AS "Total Customers",
       IFNULL(SUM(orders.amount), 0) AS "All Orders Total"
  FROM companies
  LEFT
  JOIN companies_customers
    ON companies_customers.company_id = companies.id
  LEFT
  JOIN orders
    ON orders.customer_id = companies_customers.customer_id
 GROUP
    BY companies.id
;

Editado para agregar: Dicho esto, debo decir que el esquema realmente no tiene sentido para mí. Tiene una relación de muchos a muchos entre clientes y empresas, por ejemplo, John Smith es cliente de Acme Widget Company y de Intrepid Inc. — pero entonces los pedidos son solo una propiedad del cliente, no de la compañia. Esto significa que si un pedido pertenece a John Smith , entonces necesariamente pertenece a ambos a Acme Widget Company y a Intrepid Inc. . No creo que eso pueda estar bien. En lugar de tener un customer_id campo, creo que orders necesita tener un companies_customers_id campo.