2015-02-23 51 views
0

我有如下两个表:计数不正在与LEFT JOIN

首先是Product enter image description here

,第二个是Documents enter image description here

我只想文件为计数Product表的每个记录但它只给出一行。我用下面的查询:

SELECT `p`.`Id`, 
     `p`.`Name`, 
     `u`.`FirstName`, 
     `u`.`LastName`, 
     Count(doc.Id) AS NumOfDocuments 
FROM (`Product` AS p) 
LEFT JOIN `Documents` AS doc ON `p`.`Id` = `doc`.`ProductId` 
INNER JOIN `ProductXUsers` AS pu ON `pu`.`ProductId` = `p`.`Id` 
INNER JOIN `Users` AS u ON `u`.`Id` = `pu`.`UserId` 
AND u.UserType='Customer' 
WHERE `p`.`CreatedBy` = '3' 
GROUP BY p.Id 
+0

它看起来像你的内部连接和/或where子句条件正在消除你期望看到的第二行。 – shawnt00 2015-02-23 06:56:55

回答

0

在查询中添加GROUP BY,你可以直接删除括号包围Product AS p

SELECT `p`.`Id`, 
     `p`.`Name`, 
     `u`.`FirstName`, 
     `u`.`LastName`, 
     Count(doc.Id) AS NumOfDocuments 
FROM `Product` AS p 
LEFT JOIN `Documents` AS doc ON `p`.`Id` = `doc`.`ProductId` 
INNER JOIN `ProductXUsers` AS pu ON `pu`.`ProductId` = `p`.`Id` 
INNER JOIN `Users` AS u ON `u`.`Id` = `pu`.`UserId` 
AND u.UserType='Customer' 
WHERE `p`.`CreatedBy` = '3' 
GROUP BY p.Id,`p`.`Name`,`u`.`FirstName`,`u`.`LastName` 
+0

你能告诉我为什么你在组中使用p.Name – 2015-02-23 06:34:04

+0

阅读本网站的文章:http://weblogs.sqlteam.com/jeffs/archive/2007/07/20/but-why-must-that- column-be-contained-in-an-aggregate.aspx – Rigel1121 2015-02-23 06:36:47

0

你忘了加上GROUP BY条款。

此外,您可以使用IFNULL替换null值。

SELECT `p`.`Id`, 
     `p`.`Name`, 
     `u`.`FirstName`, 
     `u`.`LastName`, 
     IFNULL(Count(doc.Id),0) AS NumOfDocuments 
FROM `Product` AS p 
INNER JOIN `ProductXUsers` AS pu ON `pu`.`ProductId` = `p`.`Id` 
INNER JOIN `Users` AS u ON `u`.`Id` = `pu`.`UserId` AND u.UserType='Customer' 
LEFT JOIN `Documents` AS doc ON `p`.`Id` = `doc`.`ProductId` 
WHERE `p`.`CreatedBy` = '3' 
GROUP BY p.Id 
+0

你能告诉我你为什么在组中使用p.Name? – 2015-02-23 06:34:59

+0

@ ManishJangirBlogaddition.com:按p.Name分组不是强制性的。你能显示一些样本数据吗? – 2015-02-23 06:37:03

+0

@ ManishJangirBlogaddition.com:即使在结果分组后,你是否只获得一行?那么这将是你的表中的数据有问题。 – 2015-02-23 06:39:17