Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL INNER JOIN di 3 tabelle con conteggio e totali

Poiché gli ordini sono collegati alle società via i clienti, non penso che tu debba eseguire due sottoquery separate e unirti a loro; piuttosto, penso che tu possa semplicemente scrivere:

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
;

Modificato per aggiungere: Detto questo, devo dire che lo schema non ha davvero senso per me. Hai una relazione molti-a-molti tra clienti e aziende, quindi, ad esempio, John Smith è un cliente di Acme Widget Company e di Intrepid Inc. — ma gli ordini sono solo una proprietà del cliente, non della compagnia. Ciò significa che se un ordine appartiene a John Smith , allora appartiene necessariamente a entrambi a Acme Widget Company e a Intrepid Inc. . Non credo che possa essere giusto. Invece di avere un customer_id campo, penso orders deve avere un companies_customers_id campo.