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
标准
我需要两个客户的总和,所以我编写了以下查询:
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
标准