2015-02-23 54 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