2014-09-21 93 views
2

我写了下面加入查询来获取使用聚合功能奇怪的MySQL连接查询的结果与聚合函数

SELECT users.id, SUM(orders.totalCost) AS bought, COUNT(comment.id) AS commentsCount, COUNT(topics.id) AS topicsCount, COUNT(users_login.id) AS loginCount, COUNT(users_download.id) AS downloadsCount 
FROM users 
LEFT JOIN orders ON users.id=orders.userID AND orders.payStatus=1 
LEFT JOIN comment ON users.id=comment.userID 
LEFT JOIN topics ON users.id=topics.userID 
LEFT JOIN users_login ON users.id=users_login.userID 
LEFT JOIN users_download ON users.id=users_download.userID 
GROUP BY users.id 
ORDER BY bought DESC 

,但我不知道为什么我得到下面的输出报告?

聚合函数的结果是相互相乘的!

我不知道为什么?

例如用于最后行i预期以下结果

821 | 48000 | 63 | 0 | 10 | 10 

enter image description here

执行EXPLAIN查询的结果示于下

enter image description here

+0

显示您预期的结果集,并且还提供了一些样本数据@ *的Sql小提琴*](http://sqlfiddle.com/) – 2014-09-21 07:27:20

+0

正确的DDL重复值@MKhalidJunaid看到预期的结果在我的更新中。列的结果是相乘的,除了id列 – 2014-09-21 07:36:30

回答

2

原因之一用于该类型的结果将是您正在使用用户表的左连接,并且结果集可能包含dup每个用户的授权行,所以你得到的数量超过预期的数量,你可以在count中使用DISTINCT来计算每个用户的唯一关联,并且总和为totalCost,你可以使用一个子查询为每个用户获得总和,而不必对于用户订单

SELECT 
    u.id, 
    COALESCE(o.bought,0) bought 
    COUNT(DISTINCT c.id) AS commentsCount, 
    COUNT(DISTINCT t.id) AS topicsCount, 
    COUNT(DISTINCT ul.id) AS loginCount, 
    COUNT(DISTINCT ud.id) AS downloadsCount 
FROM users u 
LEFT JOIN (SELECT 
      userID, 
      SUM(totalCost) bought 
      FROM orders 
      WHERE payStatus=1 
      GROUP BY userID) o 
ON u.id=o.userID 
LEFT JOIN `comment` c ON u.id=c.userID 
LEFT JOIN topics t ON u.id=t.userID 
LEFT JOIN users_login ul ON u.id=ul.userID 
LEFT JOIN users_download ud ON u.id=ud.userID 
GROUP BY u.id 
ORDER BY bought DESC 
+0

非常感谢你,它的工作;)如果你解释更多为什么结果包含重复的行? (用简单的话说),我真的很感激。 – 2014-09-21 08:26:28

+0

@MohammadMasoudian让我们举个例子,如果用户1有3条评论,那么在左边连接的情况下,每个用户会有3条连线,然后是另外一个左边连接的话题表和用户有5个话题,这3条线会连接5条线,每行用户15行,为此目的重复行我已经计算总和在子选择和计数与明确,希望这是有道理的:) – 2014-09-21 09:03:53