我正在尝试获取一个查询,该查询为我提供表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`;
答案 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成为其倍增的原因。你应该在子查询中计算它,然后使用左连接。