尝试使用连接从多个表中选择总数时遇到问题。 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
答案 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
<强>解释强>
每次计数都必须生成两个结果。然后将这些结果与名称字段结合起来。
第一个内部查询将生成文档的名称和计数。第二个内部查询将生成项目的名称和计数。然后我们将在名称字段上加入这些查询。