【问题标题】:mySQL multiple INNER JOINmySQL 多个 INNER JOIN
【发布时间】:2011-05-29 00:44:21
【问题描述】:

我们要查询三个表,以了解每个企业的客户数量和每个企业的记录数

三个表分别是:

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 和 records 进行计数。我们尝试了以下查询,但发现由于某种原因它会乘以 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

我希望我们只是犯了一些简单的错误。任何帮助将不胜感激。

【问题讨论】:

    标签: mysql count inner-join


    【解决方案1】:

    你需要这样的东西:

    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
    

    【讨论】:

    • @direct00。请注意,由于子查询,这可能会对大型记录集产生一些性能问题。
    • +1 有趣:MySql 并不总是能很好地处理 COUNT DISTINCT;这可能就是为什么这种变化比我概述的更好。
    【解决方案2】:

    如果你像这样添加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”。如果两个表都有自己的唯一 ID,则可以使用 distinct clientdetails.clientiddistinct records.recordid
    • 你是对的!感谢您指出疏忽。已相应地编辑了答案。
    • 正确 - 只需添加 DISTINCT,两者都返回 1。
    • 两个表都有自己的唯一 ID,所以我尝试使用 DISTINCT 代替,但查询超时。
    【解决方案3】:

    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
    

    【讨论】:

      猜你喜欢
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 2011-03-03
      • 2014-01-22
      • 2023-03-10
      相关资源
      最近更新 更多