簡體   English   中英

MySQL Group By 並根據條件從分組結果中返回不同的行

[英]MySQL Group By and return distinct rows from grouped result based on conditions

背景

  1. 下表顯示了特定電話店三個分店的產品列表
  2. 值為“0”的“branch_id”表示該產品在所有分店都有售
  3. 我想查詢“branch_id = 2”的不同產品 - 包括逗號分隔字符串和“branch_id = 0”中的產品;
  4. 但是,如果結果返回具有相同“product_name”的多行,在本例中為“Iphone X”,則應返回“branch_id”不等於“0”的行。

產品

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM