【问题标题】:Using count in mysql join在 mysql join 中使用 count
【发布时间】:2014-10-23 04:31:08
【问题描述】:

我一直在尝试编写一个 sql 查询来从 bugzilla 获取一些统计信息。这是查询

select bugs.bug_id AS bug_id, 
       COUNT(map_pingpong.bug_when) AS re_open, 
       MAX(map_closetime.bug_when) AS closed_date 
  from bugs 
         LEFT JOIN bugs_activity AS map_pingpong 
                 ON ((map_pingpong.bug_id = bugs.bug_id 
                        and map_pingpong.fieldid=15)) 
         LEFT JOIN bugs_activity AS map_closetime 
                 ON ((bugs.bug_id = map_closetime.bug_id 
                        and map_closetime.fieldid=8 
                        and bugs.bug_status = 'CLOSED' )) 
 where (bugs.assigned_to = 480) 
 GROUP BY bugs.bug_id 
 ORDER BY bug_id;

所以,查询应该返回两件事

1) 发生事件的计数 2) 事件发生的日期

因此,当我将查询分成两个不同的查询时,它们会返回正确的值。如果我按上述方式运行它,则计数值是错误的(尽管日期是正确的)。我不应该在同一张桌子上运行两个连接吗?或者 count 不应该在你使用 join 时出现?

【问题讨论】:

  • 你不能在代码 sn-p 中运行 SQL,它只适用于 Javascript。
  • 当您运行两个连接时,您会得到两个表的笛卡尔积,count() 将计算积中的行数。
  • 你可以使用COUNT(DISTINCT map_pingpong.some_unique_column)解决它
  • 抱歉添加代码 sn-p.. 我认为这样查询会更便于阅读:)

标签: mysql join count


【解决方案1】:

正如 Barmar 所说,您必须分离结果集才能获得正确的计数:

SELECT 
    bugs.bug_id AS bug_id, 
    map_pingpong.cnt AS re_open, 
    map_closetime.mx AS closed_date
FROM bugs 
    LEFT JOIN (
        SELECT bug_id, COUNT(bug_when) AS cnt
        FROM bugs_activity
        WHERE fieldid = 15
        GROUP BY bug_id
    ) AS map_pingpong ON map_pingpong.bug_id = bugs.bug_id
    LEFT JOIN (
        SELECT ba.bug_id, MAX(ba.bug_when) AS mx
        FROM bugs_activity ba JOIN bugs ON bugs.bug_status = 'CLOSED' AND ba.bug_id = bug.bug_id AND bugs.assigned_to = 480
        WHERE ba.fieldid = 8
        GROUP BY ba.bug_id
    ) AS map_closetime ON bugs.bug_id = map_closetime.bug_id
WHERE bugs.assigned_to = 480
GROUP BY bugs.bug_id 
ORDER BY bug_id;

由于这在功能上是正确的,因此在性能方面可能是一场彻底的灾难,所以要小心...

【讨论】:

  • 非常感谢 barmar 和 semas。我现在明白了这个问题。我假设 count 仅适用于相应的 JOIN 案例。
猜你喜欢
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2012-01-28
  • 1970-01-01
相关资源
最近更新 更多