MySQL使用JOIN COUNT多个表

时间:2015-02-23 10:25:17

标签: mysql sql

尝试使用连接从多个表中选择总数时遇到问题。 COUNT的结果不正确。

我有三张桌子:

Customers
id -> Primary/Autoincrement
name

Documents
id -> Primary/Autoincrement
customer_id

Documents_items
id -> Primary/Autoincrement
document_id

我想获得按客户名称分组的文件和文件项目总数。

    SELECT cust.name, 
           COUNT(doc.id), 
           COUNT(item.id)
      FROM customers AS cust
INNER JOIN documents AS doc ON doc.customer_id = cust.id
INNER JOIN documents_items AS item ON item.document_id = doc.id
  GROUP BY cust.name

问题是COUNT(doc.id)的结果等于COUNT(item.id)的结果,这是不正确的。

您可以在 SQLFiddle 中看到错误的演示示例。

输入示例

INSERT INTO customers VALUES('John')
INSERT INTO documents VALUES(1)
INSERT INTO documents_items VALUES(1), VALUES(1)

预期输出

Name     |    Total Docs    | Total Items
John              1               2

当前输出

Name     |    Total Docs    | Total Items
John              2               2

2 个答案:

答案 0 :(得分:6)

您希望count the distinct记录身份证明和项目ID。

    SELECT cust.name, 
           COUNT(DISTINCT doc.id), 
           COUNT(DISTINCT item.id)
      FROM customers AS cust
INNER JOIN documents AS doc ON doc.customer_id = cust.id
INNER JOIN documents_items AS item ON item.document_id = doc.id
  GROUP BY cust.name

答案 1 :(得分:0)

尝试这种方式:

SELECT T1.name,T1.Docs,T2.Items
FROM 
( SELECT cust.name, COUNT(doc.id) as Docs
  FROM customers AS cust
  INNER JOIN documents AS doc ON doc.customer_id = cust.id
  GROUP BY cust.name) T1 JOIN

( SELECT cust.name, COUNT(item.id) as Items
  FROM customers AS cust
  INNER JOIN documents AS doc ON doc.customer_id = cust.id
  INNER JOIN documents_items AS item ON item.document_id = doc.id
  GROUP BY cust.name) ON T1.name =T2.name

<强>解释

每次计数都必须生成两个结果。然后将这些结果与名称字段结合起来。

第一个内部查询将生成文档的名称和计数。第二个内部查询将生成项目的名称和计数。然后我们将在名称字段上加入这些查询。