mySQL множественный INNER JOIN - PullRequest
       8

mySQL множественный INNER JOIN

3 голосов
/ 21 декабря 2010

У нас есть три таблицы, которые мы хотели бы запросить, чтобы выяснить количество клиентов на бизнес и количество записей на бизнес

Три таблицы:

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

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

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

Мыне возникает проблем с возможностью выбрать счетчик из двух таблиц одновременно (businessDetails плюс записи clientDetails ИЛИ).Например,

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

Этот запрос дает нам хороший результат, как и ожидалось:

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

Проблема, с которой мы сталкиваемся, заключается в том, как подсчитать обе записи clientDetails И одновременно.Мы попробовали следующий запрос, но обнаружили, что он по какой-то причине умножает количество totalClients:

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

Это возвращает результат примерно так:

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

Я ожидаю, что мыпросто делаю простую ошибку.Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

4 голосов
/ 21 декабря 2010

Вам нужно что-то вроде этого:

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
2 голосов
/ 21 декабря 2010

Как насчет того, чтобы добавить DISTINCT следующим образом:

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

таким образом, для каждой группы businessDetails.name у вас будет количество различных clientDetails и записей в этом "окне".

1 голос
/ 21 декабря 2010

Count (Distinct [FieldName]) работает в MYSQL. Попробуйте.

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
...