Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL INNER JOIN de 3 tables avec décompte et totaux

Étant donné que les commandes sont liées aux entreprises via les clients, je ne pense pas que vous ayez besoin d'effectuer deux sous-requêtes distinctes et de les joindre ; plutôt, je pense que vous pouvez simplement écrire :

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
;

Modifié pour ajouter : Cela dit, je dois dire que le schéma n'a pas vraiment de sens pour moi. Vous avez une relation plusieurs-à-plusieurs entre les clients et les entreprises ; par exemple, John Smith est un client de Acme Widget Company et de Intrepid Inc. — mais alors les commandes ne sont qu'une propriété du client, pas de la compagnie. Cela signifie que si une commande appartient à John Smith , alors il appartient nécessairement aux deux à Acme Widget Company et à Intrepid Inc. . Je ne pense pas que cela puisse être juste. Au lieu d'avoir un customer_id champ, je pense que orders doit avoir un companies_customers_id champ.