Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL INNER JOIN de 3 tabelas com contagem e totais


Como os pedidos estão vinculados às empresas via os clientes, não acho que você precise realizar duas subconsultas separadas e juntá-las; em vez disso, acho que você pode simplesmente escrever:
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 adicionar: Dito isso, devo dizer que o esquema realmente não faz sentido para mim. Você tem um relacionamento de muitos para muitos entre clientes e empresas — por exemplo, John Smith é cliente da Acme Widget Company e da Intrepid Inc. — mas os pedidos são apenas uma propriedade do cliente, não da empresa. Isso significa que se um pedido pertencer a John Smith , então ele necessariamente pertence a ambos para Acme Widget Company e para Intrepid Inc. . Eu não acho que isso pode estar certo. Em vez de ter um customer_id campo, acho que orders precisa ter um companies_customers_id campo.