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 8.0.24:转储/恢复失败,嵌套视图在 DISTINCT 组上具有 ROLLUP