【问题标题】:MySQL - adding join changes count/sum values?MySQL - 添加连接更改计数/总和值?
【发布时间】:2018-01-11 13:12:24
【问题描述】:

我不禁认为这是一个常见问题,但对于我的一生,我找不到解决方案。

假设我有这个查询:

SELECT
    ue.user,
    SUM(w.times) AS total_watches,
    COUNT(w.vid_id) AS total_unique_watches,
FROM users ue
LEFT JOIN watches w ON w.user_id = ue.user
WHERE ue.user = "fv9jgpd1cmo" && ue.user_type IN ("ds", "s")
GROUP BY ue.user

效果很好。它会拉出用户,加上他们观看任何视频的次数,以及他们观看过的独特视频的数量。这些值是正确的 - 我已经检查过了。

如果我随后使用另一个连接扩展查询:

SELECT
    ue.user,
    SUM(w.times) AS total_watches,
    COUNT(w.vid_id) AS total_unique_watches,
    COUNT(DISTINCT m.linked_vid_evt) AS answered_vid_events
FROM users ue
LEFT JOIN watches w ON w.user_id = ue.user
LEFT JOIN messages m ON m.from_uid = ue.user /* <-- new join */
WHERE ue.user = "fv9jgpd1cmo" && ue.user_type IN ("ds", "s")
GROUP BY ue.user

...之前的 COUNT/SUM 统计数据现在已经偏离(在本例中,total_watches 应该是 40,然后跳转到 880。)

我做错了什么?

我很确定这与 GROUP BY 有关,并且我尝试向其中添加列,但我似乎无法破解它。

【问题讨论】:

  • 毫无疑问,新连接会创建更多记录(一对多关系)。为了解决这个问题,您可以使用子查询来计算每个 from_uid 的linked_vid_evt,然后再加入外部查询
  • 有趣...如果您可以在答案中详细说明,我会试一试。谢谢。

标签: mysql sql count aggregate-functions


【解决方案1】:

试试下面的。它首先使用计算count 的子查询。在此解决方案中,distinct 也可能是不必要的。

SELECT
    ue.user,
    SUM(w.times) AS total_watches,
    COUNT(w.vid_id) AS total_unique_watches,
    m.answered_vid_events
FROM users ue
LEFT JOIN watches w ON w.user_id = ue.user
LEFT JOIN (
   SELECT from_uid, COUNT(DISTINCT linked_vid_evt) answered_vid_events
   FROM messages
   GROUP BY from_uid 
) m ON m.from_uid = ue.user
WHERE ue.user = "fv9jgpd1cmo" && ue.user_type IN ("ds", "s")
GROUP BY ue.user

【讨论】:

  • 谢谢 - 辛苦了。为什么我不必为第一次加入,在手表上这样做?是否只有第一个之后的后续加入?
  • @Utkanos 因为watches 的一行只有一个用户,所以没关系。但是当您加入messages 时,watches 的一行可能有许多对应的messages(通过users),反之亦然。因此,watchesmessages 聚合必须在子查询中(或两者都可能)。
猜你喜欢
  • 2016-08-25
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
相关资源
最近更新 更多