[英]MySQL Group By and return distinct rows from grouped result based on conditions
Background背景
Products产品
id ![]() |
product_name![]() |
branch_id![]() |
price![]() |
---|---|---|---|
1 ![]() |
Iphone X![]() |
2,3 ![]() |
700 ![]() |
2 ![]() |
Iphone X![]() |
0 ![]() |
500 ![]() |
3 ![]() |
Samsung S8![]() |
2 ![]() |
600 ![]() |
4 ![]() |
Ipad Pro![]() |
1 ![]() |
750 ![]() |
5 ![]() |
Apple watch![]() |
0 ![]() |
550 ![]() |
6 ![]() |
Samsung S9![]() |
1,2 ![]() |
600 ![]() |
Expected Result预期结果
id ![]() |
product_name![]() |
branch_id![]() |
price![]() |
---|---|---|---|
1 ![]() |
Iphone X![]() |
2 ![]() |
700 ![]() |
3 ![]() |
Samsung S8![]() |
2 ![]() |
600 ![]() |
5 ![]() |
Apple watch![]() |
0 ![]() |
550 ![]() |
6 ![]() |
Samsung S9![]() |
2 ![]() |
600 ![]() |
My Query - it doesn't return rows with branch_id = 0我的查询- 它不返回 branch_id = 0 的行
select id, product_name, branch_id, price FROM products
group by product_name,branch_id
having CASE
WHEN FIND_IN_SET(2, branch_id) > 0 THEN FIND_IN_SET(2, branch_id) > 0
WHEN branch_id = 0 THEN branch_id = 0
ELSE branch_id = NULL
END
Use NOT EXISTS
:使用
NOT EXISTS
:
SELECT id, product_name,
CASE WHEN branch_id = '0' THEN branch_id ELSE '2' END branch_id,
price
FROM Products p1
WHERE FIND_IN_SET(2, p1.branch_id)
OR (
p1.branch_id = 0
AND NOT EXISTS (
SELECT 1
FROM Products p2
WHERE p2.product_name = p1.product_name
AND FIND_IN_SET(2, p2.branch_id)
)
);
Or, if your version of MySql is 8.0+ use ROW_NUMBER()
window function:或者,如果您的 MySql 版本是 8.0+,请使用
ROW_NUMBER()
窗口函数:
SELECT id, product_name,
CASE WHEN branch_id = '0' THEN branch_id ELSE '2' END branch_id,
price
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY product_name ORDER BY FIND_IN_SET(2, branch_id) > 0 DESC) rn
FROM Products
WHERE FIND_IN_SET(2, branch_id) OR branch_id = '0'
) t
WHERE rn = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.