MySQL sum 和 distinct 在具有多个连接的另一列上

Posted

技术标签:

【中文标题】MySQL sum 和 distinct 在具有多个连接的另一列上【英文标题】:MySQL sum and distinct on another column with multiple joins 【发布时间】:2014-02-25 23:14:34 【问题描述】:

我需要编写一个 mysql 查询,为我提供有关已定义用户的统计信息。假设我需要销售人员、他加入的群组数量以及他交到的朋友数量。

SELECT  SUM( sells.qtty ) sells,
        SUM( sells.price ) total,
        COUNT( DISTINCT groups.id ) groupsTotal,
        COUNT( DISTINCT friends.id ) friendsTotal
FROM members
LEFT JOIN   sells
    ON      sells.idmember  = members.id
LEFT JOIN   groups
    ON      groups.idmember = members.id
LEFT JOIN   friends
    ON      friends.idmember    = members.id
where members.id = 3

假设这给了我 40 个组和 20 个朋友。我不能在销售表的 ID 列上使用 distinct。所以这些总和给了我疯狂的销售量(如果是真的,那就太好了,但在尝试显示统计数据时就不行了)。

我在这里很困惑...提前感谢您的帮助!

【问题讨论】:

考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集 【参考方案1】:

您需要在连接之前进行聚合。一种方法是在from 子句中使用子查询:

select  s.sells, s.total, g.groupsTotal, f.friendsTotal
from members m left outer join
     (select s.idmember, sum(s.qtty) as sells, sum(s.price) as total
      from sells s
      where s.idmember = 3
     ) s
     ON s.idmember  = m.id left outer join
     (select g.idmember, count(*) as groupstotal
      from groups g
      where g.idmember = 3
     ) g
     on g.idmember = m.id left outer join
     (select f.idmember, count(*) as friendstotal
      from friends
      where f.idmember = 3
     ) f
     on f.idmember  = m.id
where m.id = 3;

通常,子查询中的 where 子句将改为 group by。但是您只选择了一个成员,因此在每个子查询中进行过滤会更有效。

【讨论】:

我尝试过这样的事情,这实际上是我找到的最好的解决方案 ATM 无需两次调用数据库。问题是,在一个真正的查询中,我没有成员的ID,我只能使用group by命令,然后在派生表中丢失索引(根据解释表是全读的)。我想最有效的方法是对 DB 进行两次调用... @JeremyBelolo 。 . .可能有一种方法可以在一个查询中完成。我的建议是问另一个问题,用一个更接近你真正问题的示例查询。 我可能试图简化太多...再次感谢。

以上是关于MySQL sum 和 distinct 在具有多个连接的另一列上的主要内容,如果未能解决你的问题,请参考以下文章

Mysql sum distinct 基于包含多个 LEFT JOIN 的其他列

跨 MYSQL 中的多个列选择 SUM(DISTINCT 值)

MySQL最常用分组聚合函数

MySql 8.0.24:转储/恢复失败,嵌套视图在 DISTINCT 组上具有 ROLLUP

MYSQL 从具有 100 万行的表中选择 distinct(indexed_column)

SQL多个字段如何去重