MYSQL 如何去除重复项

MYSQL How to get rid of duplicates

我需要两个客户的总和,所以我编写了以下查询:

SELECT m.m_name, m2.m_name AS m_name2, SUM(m.price + m2.price) as total_amount, rn.name 
FROM
(      
SELECT m.name AS m_name, m.id AS m_id ,IFNULL(SUM(d.num * p.price), 0) AS price
FROM m_member as m
LEFT JOIN t_sales AS t ON m.id = t.m_id
INNER JOIN m_product as p
LEFT JOIN t_sales_detail as d ON t.id = d.id AND p.id = d.p_id
GROUP BY m.id
)AS m 
LEFT JOIN 
(      
SELECT m.name AS m_name, m.id AS m2_id ,IFNULL(SUM(d.num * p.price), 0) AS price
FROM m_member as m
LEFT JOIN t_sales AS t ON m.id = t.m_id
INNER JOIN m_product as p
LEFT JOIN t_sales_detail as d ON t.id = d.id AND p.id = d.p_id
GROUP BY m.id
) AS m2 ON m.m_id != m2.m2_id
JOIN m_lank AS rn ON (SELECT SUM(m.price + m2.price)) BETWEEN rn.low_limit AND rn.up_limit
GROUP BY m.m_id, m2.m2_id
order by total_amount;

结果如下所示:

# m_name    m_name2    total_amount    name
Nagayama    Kawata         380        Bronze
Kawata      Nagayama       380        Bronze
Nagaoku     Kawata         500        Bronze
Kawata      Nagaoku        500        Bronze
Nagayama    Nagaoku        880        Bronze
Nagaoku     Nagayama       880        Bronze
Kawashima   Kawata         2620       Bronze
Kawata      Kawashima      2620       Bronze
...

问题是,我不需要对同一个客户求和两次。 我怎样才能摆脱重复的结果?有人有解决方案吗?

编辑: 我想要这样的东西:

# m_name    m_name2    total_amount    name
Nagayama    Kawata         380        Bronze
Nagaoku     Kawata         500        Bronze
Nagayama    Nagaoku        880        Bronze
Kawashima   Kawata         2620       Bronze
...

抱歉我的英语不好。可能很难理解我需要什么。

基本上我总共有五个客户。 客户 A 总共购买了 400$ 客户 B 总共购买了 1030 美元。 客户 C .... 1540 美元。 客户 D .... 0$。 客户 F .... 320$.

现在我想把每个客户相互求和:

A + B
A + C
A + D
A + F
B + C
B + D
B + F
C + D
C + F
D + F

如果我对您的理解正确,只需对您的查询进行最小的更改即可实现。只需将 != 替换为 <>。因此,您每对只能获得一次。

SELECT m.m_name, m2.m_name AS m_name2, SUM(m.price + m2.price) as total_amount, rn.name 
FROM
(      
SELECT m.name AS m_name, m.id AS m_id ,IFNULL(SUM(d.num * p.price), 0) AS price
FROM m_member as m
LEFT JOIN t_sales AS t ON m.id = t.m_id
INNER JOIN m_product as p
LEFT JOIN t_sales_detail as d ON t.id = d.id AND p.id = d.p_id
GROUP BY m.id
)AS m 
LEFT JOIN 
(      
SELECT m.name AS m_name, m.id AS m2_id ,IFNULL(SUM(d.num * p.price), 0) AS price
FROM m_member as m
LEFT JOIN t_sales AS t ON m.id = t.m_id
INNER JOIN m_product as p
LEFT JOIN t_sales_detail as d ON t.id = d.id AND p.id = d.p_id
GROUP BY m.id
) AS m2 ON m.m_id > m2.m2_id
JOIN m_lank AS rn ON (SELECT SUM(m.price + m2.price)) BETWEEN rn.low_limit AND rn.up_limit
GROUP BY m.m_id, m2.m2_id
order by total_amount;

使用 CTE,我们可以重复使用 table user_totals

WITH user_totals AS
  (SELECT s.m_id AS id,
          sum(sd.num*p.price) AS sales_amount
   FROM t_sales_detail sd
   JOIN m_product p ON sd.p_id=p.id
   JOIN t_sales s ON s.id=sd.id
   GROUP BY s.m_id)
SELECT m1.name,
       m2.name,
       t1.sales_amount+t2.sales_amount
FROM user_totals t1
JOIN user_totals t2 ON t1.id < t2.id
JOIN m_member m1 ON t1.id = m1.id
JOIN m_member m2 ON t2.id = m2.id

与其他答案一样,than/less 比仅获得一个匹配项的良好 JOIN 标准要大。

!= 制定了一个错误的连接标准,因为您在所有行上都不匹配,它很少会达到您的预期。 这方面的一个例子是 fiddle

注意:为了提高可读性,删除了行限制和 IFNULL 标准