左连接返回空结果集


Left join returns empty resultset

SELECT branch_name, workerID, COUNT(*) 
FROM company_branch 
LEFT JOIN workers ON workers.branchID = company_branch.branchID 
WHERE companyID=? 
GROUP BY workers.branchID

我有一个公司,公司分支机构和工人的数据库。每个公司都有分支机构,每个分支机构都有工人。

树:公司>公司分公司>工人

现在我想要的是获取每个分支的所有分支和辅助角色计数的列表。

我的查询有效,但当 0 个工作人员为分支机构工作时无效。我想要所有公司分支机构的清单,即使认为没有任何工人。

按您拥有的数据分组/保证,而不是按LEFT JOIN中的某些数据分组:

GROUP BY company_branch.branchID

您正在分组workers.branchID .如果分支没有工作线程,则该字段实际上将为 null。您应该改为company_branch.brandID分组。由于它位于联接的左侧,因此无论实际附加到该分支的辅助角色数量(或数量很少)如何,它都将始终可用。

只是为了澄清Mark B和Wrikken所写的内容:

当您在可能为空的字段上使用GROUP BY时,发生的情况是,您没有列出零条记录,而是将所有company_branch记录集中在一起,没有 (NULL ) 工作线程 - 这就是您的COUNT(*)值将指示的内容。

下面是 sqlfiddle 中发生的事情的示例: http://sqlfiddle.com/#!2/4fa23/2/0

在那里,您有两个分支("分支 2.1"和"分支 2.2"),并且都没有工作人员。因此,您的COUNT(*)是 2,但只显示第一条company_branch记录,并且全部在单个记录中。

解决方案正如 Mark B 和 Wrikken 所说 - 更改您的GROUP BY以使用 company_branch.branchID .