![](/img/trans.png)
[英]MySQL: Remove rows from a GROUP BY result if it only grouped 1 row
[英]MySQL Group By and return distinct rows from grouped result based on conditions
背景
產品
ID | 產品名稱 | 分支編號 | 價格 |
---|---|---|---|
1 | 蘋果手機 | 2,3 | 700 |
2 | 蘋果手機 | 0 | 500 |
3 | 三星S8 | 2 | 600 |
4 | 掌上電腦 | 1 | 750 |
5 | 蘋果手表 | 0 | 550 |
6 | 三星S9 | 1,2 | 600 |
預期結果
ID | 產品名稱 | 分支編號 | 價格 |
---|---|---|---|
1 | 蘋果手機 | 2 | 700 |
3 | 三星S8 | 2 | 600 |
5 | 蘋果手表 | 0 | 550 |
6 | 三星S9 | 2 | 600 |
我的查詢- 它不返回 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
使用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)
)
);
或者,如果您的 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.