两个具有左连接的COUNTER正在被乘以

时间:2011-06-17 04:44:01

标签: mysql sql join count left-join

我正在尝试获取一个查询,该查询为我提供表Users的UserNames,用户从表Job2User获取的Jobs数,以及用户从Place2User表中获取的Places数。

以下查询将两个计数列的值相乘。例如,如果对于用户1,作业计数应为2且位置计数应为4,则用户1行中的两列将显示“8”。我不确定我做错了什么:

SELECT `UserName`, COUNT(`Job2User`.`UserID`), COUNT(`Place2User`.`UserID`) 
FROM `Users`
LEFT JOIN `Job2User` ON `Job2User`.`UserID`=`Users`.`UserID` 
LEFT JOIN `Place2User` ON `Place2User`.`UserID`=`Users`.`UserID` 
GROUP BY `UserName`;

5 个答案:

答案 0 :(得分:22)

您应该使用count( distinct ...)来计算唯一值。而不是计算userid(外键)计数引用表的主键。

请参阅docs here

你得到8分,因为你要从工作中返回2条记录而从地方返回4条记录。由于您没有计算不同的值,因此得到2 * 4 = 8。

答案 1 :(得分:1)

您的问题很可能是您没有映射Place2User和Job2User表,因此您正在预先形成交叉连接。 More info on Cross Joins

除非您将两个表Place2User以某种方式与Job2User相关,否则您将需要使用内部查询来实现此目的。

试试这个:

SELECT `UserName`, `Job2User`.`Count`, `Place2User`.`Count` 
FROM `Users`
LEFT JOIN (SELECT `UserID`, COUNT(1) AS 'Count' FROM `Job2User` GROUP BY `UserID`) `Job2User` ON `Job2User`.`UserID`=`Users`.`UserID` 
LEFT JOIN (SELECT `UserID`, COUNT(1) AS 'Count' FROM `Place2User` GROUP BY `UserID`) `Place2User` ON `Place2User`.`UserID`=`Users`.`UserID` 

答案 2 :(得分:0)

一种选择是为要计算的每个表使用内联视图

SELECT `UserName`, `Job2User`.`Job2UserCount`, `Place2User`.`Place2UserCount`
FROM `Users`
 ` 
LEFT JOIN
(SELECT

 COUNT(`Job2User`.`UserID`) Job2UserCount ,
 UserID
FROM
 Job2User
 GROUP BY 
  `UserID` )Job2User
ON `Job2User`.`UserID`=`Users`.`UserID
LEFT JOIN
(SELECT

 COUNT(`Place2User`.`UserID`) Place2UserCount,
 UserID
FROM
 Job2User
 GROUP BY 
  `UserID` )Place2User
ON `Place2User`.`UserID`=`Users`.`UserID` 
GROUP BY `UserName`; 

答案 3 :(得分:0)

我看到的第一个问题是你的联接倒退了。您正在进行左连接,但Users表位于该连接的右侧。你需要像这样切换:

SELECT `UserName`, COUNT(`Job2User`.`UserID`), COUNT(`Place2User`.`UserID`) 
FROM `Users`
LEFT JOIN `Job2User` ON `Users`.`UserID`=`Job2User`.`UserID` 
LEFT JOIN `Place2User` ON `Users`.`UserID` =`Place2User`.`UserID`
GROUP BY `UserName`;

由于你在没有链接的情况下对那些将为NULL的字段进行计数,这可能会起作用(对不起,它已经很晚了,我的大脑有点模糊)。如果没有,这是你可以做到的一种方式:

SELECT UserName, 
  (SELECT COUNT(Job2User.UserID) 
   FROM Job2User 
   WHERE Job2User.UserID = t.UserID) AS Job2UserCount,
  (SELECT COUNT(Place2User.UserID) 
   FROM Place2User 
   WHERE Place2User.UserID = t.UserID) AS Place2UserCount
FROM Users AS t

答案 4 :(得分:0)

对于每个Job2User来说,它很简单,让所有Place2user成为其倍增的原因。你应该在子查询中计算它,然后使用左连接。