2010-12-21 21 views
3

Wir haben drei Tabellen, die wir die Anzahl der Kunden pro Unternehmen und die Anzahl der Datensätze pro Unternehmen abfragen möchten, um herauszufinden,mySQL mehrere INNER JOIN

Die drei Tabellen sind:

businessDetails 
------------------- 
businessDetails.ID 
businessDetails.name 

clientDetails 
------------------- 
clientDetails.ID 
clientDetails.businessDetailsID 

records 
------------------- 
records.ID 
records.businessDetailsID 

Wir Es gibt kein Problem damit, eine Zählung aus zwei Tabellen gleichzeitig auswählen zu können (businessDetails plus entweder clientDetails ODER Datensätze). Zum Beispiel

SELECT businessDetails.name AS businessName 
     , COUNT(clientDetails.businessDetailsID) AS totalClients 
FROM `businessDetails` 
INNER JOIN clientDetails 
     ON clientDetails.businessDetailsID = businessDetails.businessDetailsID 
GROUP BY 
businessDetails.name 
ORDER BY 
totalClients DESC 

Diese Abfrage gibt uns ein gutes Ergebnis wie erwartet:

-------------------------------- 
businessName | totalClients 
-------------------------------- 
Initech   | 23 
Cylon Inc  | 148 
The Dude Ltd | 71 

Das Problem, das wir in laufen ist wie eine Zählung auf beiden clientDetails und Aufzeichnungen auf einmal zu tun. Wir haben versucht, die folgende Abfrage, haben aber festgestellt, dass es die Anzahl der totalClients aus irgendeinem Grund vervielfacht:

SELECT businessDetails.name AS businessName 
     , COUNT(clientDetails.businessDetailsID) AS totalClients 
     , COUNT(records.businessDetailsID) AS totalRecords 
FROM `businessDetails` 
INNER JOIN clientDetails 
     ON clientDetails.businessDetailsID = businessDetails.businessDetailsID 
INNER JOIN records ON records.businessDetailsID = businessDetails.ID 
GROUP BY 
businessDetails.name 
ORDER BY 
totalClients DESC 

dies ein Ergebnis etwas gibt wie:

-------------------------------------------------------- 
businessName | totalClients | totalRecords 
-------------------------------------------------------- 
Initech   | 93    | 93 
Cylon Inc  | 398    | 398 
The Dude Ltd | 215    | 215 

Ich erwarte, dass wir machen nur ein paar einfache Error. Jede Hilfe würde sehr geschätzt werden.

Antwort

4

Sie brauchen etwas wie folgt aus:

SELECT 
    businessDetails.name AS businessName, 
    (SELECT count('x') FROM clientDetails WHERE clientDetails.businessDetailsID = businessDetails.businessDetailsID) as totalclients, 
    COUNT(records.businessDetailsID) AS totalRecords 
FROM 
    `businessDetails` 
    INNER JOIN records ON records.businessDetailsID = businessDetails.ID 
GROUP BY 
    businessDetails.name 
ORDER BY 
    totalClients DESC 
+0

Danke - das hat sehr gut funktioniert! – direct00

+0

@ direct00. Beachten Sie, dass dies bei großen Recordsets aufgrund der Unterabfrage zu Leistungsproblemen führen kann. –

+0

+1 interessant: MySql kommt mit COUNT DISTINCT nicht immer zurecht; Das ist wahrscheinlich der Grund, warum diese Variante besser funktioniert als die, die ich skizziert habe. – davek

2

über Wie wenn Sie eine DISTINCT wie folgt hinzu:

SELECT businessDetails.name AS businessName 
     , COUNT(distinct clientDetails.ID) AS totalClients 
     , COUNT(distinct records.ID) AS totalRecords 
FROM `businessDetails` 
INNER JOIN clientDetails 
     ON clientDetails.businessDetailsID = businessDetails.businessDetailsID 
INNER JOIN records ON records.businessDetailsID = businessDetails.ID 
GROUP BY 
businessDetails.name 
ORDER BY 
totalClients DESC 

auf diese Weise, für jede Gruppe von businessDetails.name, haben Sie die Anzahl der deutlichen clientDetails und Aufzeichnungen innerhalb dieses „Fenster“.

+2

Ich denke, das wird Ihnen "1" für beide zählt. Sie können 'distinct clientdetails.clientid' und' distinct records.recordid' verwenden, wenn beide Tabellen ihre eigenen eindeutigen IDs haben. – GolezTrol

+0

Sie haben Recht! Danke, dass Sie auf das Versehen hingewiesen haben. habe die Antwort entsprechend bearbeitet. – davek

+0

Richtig - nur das Hinzufügen von DISTINCT ergab 1 für beide. – direct00

1

Count(Distinct [FieldName]) Werke in MYSQL. Versuche es.

SELECT businessDetails.name AS businessName 
     , COUNT(Distinct clientDetails.businessDetailsID) AS totalClients 
     , COUNT(records.businessDetailsID) AS totalRecords 
FROM `businessDetails` 
INNER JOIN clientDetails 
     ON clientDetails.businessDetailsID = businessDetails.businessDetailsID 
INNER JOIN records ON records.businessDetailsID = businessDetails.ID 
GROUP BY 
businessDetails.name 
ORDER BY 
totalClients DESC