sql >> Databasteknik >  >> RDS >> Mysql

MySQL INNER JOIN av 3 tabeller med antal och totaler

Eftersom beställningarna är kopplade till företagen via kunderna, jag tror inte att du behöver utföra två separata underfrågor och gå med dem; snarare tror jag att du bara kan skriva:

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
;

Redigerad för att lägga till: Som sagt, jag måste säga att schemat inte riktigt är vettigt för mig. Du har en många-till-många-relation mellan kunder och företag — så till exempel John Smith är kund hos Acme Widget Company och av Intrepid Inc. — men då är beställningar bara kundens egendom, inte av företaget. Detta betyder att om en beställning tillhör John Smith , då tillhör det nödvändigtvis båda till Acme Widget Company och till Intrepid Inc. . Jag tror inte att det kan vara rätt. Istället för att ha ett customer_id fält, tror jag orders måste ha ett companies_customers_id fältet.



  1. Lägg till en kolumn i en tabell i alla scheman i en PostgreSQL-databas

  2. sql-server välj första raden från en grupp

  3. SQL räkna specifikt värde över flera kolumner och rader

  4. MYSQL-databasoptimering med indexering