【问题标题】:strange MySQL join query results with aggregate functions带有聚合函数的奇怪 MySQL 连接查询结果
【发布时间】:2014-09-21 07:12:39
【问题描述】:

我编写了以下 join 查询以使用 聚合 函数获取报告

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

但我不知道为什么会得到以下输出?

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

不知道为什么?

例如,对于最后一行,我希望得到以下结果

821    |    48000    |    63    |    0    |    10    |    10

执行EXPLAIN查询的结果如下所示

【问题讨论】:

  • 显示您的预期结果集并提供适当的 ddls 以及一些示例数据@Sql Fiddle
  • @MKhalidJunaid 在我的更新中看到预期的结果。除 id 列外,列的结果相乘

标签: mysql database join indexing aggregate-functions


【解决方案1】:

这种类型结果的一个原因是您对用户表使用左连接,并且结果集可能包含每个用户的重复行,因此您获得的计数比预期的要多,您可以使用 @计数中的 987654321@ 仅计算每个用户的唯一关联,对于 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

【讨论】:

  • 非常感谢,它的工作;)如果你解释更多为什么结果包含重复的行? (用简单的话),我真的很感激。
  • @MohammadMasoudian 举个例子,如果用户 1 有 3 个 cmets,那么左连接每个用户将有 3 行,然后另一个左连接与主题表和用户有 5 个主题,这 3 行将是加入 5 行,结果为每个用户 15 行重复行,为此我计算了子选择中的总和并以不同的方式计数,希望这是有道理的 :)
猜你喜欢
  • 2015-11-26
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2017-10-27
  • 2018-09-01
  • 2015-03-23
  • 1970-01-01
  • 2013-09-04
相关资源
最近更新 更多