MySQL按parent_sku分组时为指定域名赋予优先级的实现方法
实现域名优先级的分组排序方案
要让特定域名(比如themusthaves)的分组结果优先展示,你只需要在ORDER BY子句中添加一个条件排序字段,给目标域名赋予更高的优先级权重,再保留原有的sales降序逻辑即可。
基础解决方案:排序时优先展示目标域名分组
直接修改你的查询语句,在ORDER BY开头加入一个CASE判断,让目标域名的分组排在最前面:
SELECT domain, parent, parent_name, parent_sku, SUM(qty) AS sales, SUM(gross) AS revenue, SUM(net) AS net_revenue, SUM(refund_qty) AS returns, created_at FROM report_byproducts_name GROUP BY parent_sku ORDER BY -- 给目标域名设置最高优先级(0比1小,升序排序时会排在前面) CASE WHEN domain = 'themusthaves' THEN 0 ELSE 1 END, sales DESC LIMIT 50;
逻辑说明
CASE WHEN domain = 'themusthaves' THEN 0 ELSE 1 END会为themusthaves域名的分组标记为0,其他分组标记为1。在升序排序下,标记0的分组会全部排在标记1的分组之前。- 同一优先级内的分组,依然按照
sales从高到低排序,保留你原本的业务逻辑。
扩展:多域名优先级排序
如果需要给多个域名设置不同的优先级(比如先themusthaves,再example.com),可以扩展CASE语句:
ORDER BY CASE domain WHEN 'themusthaves' THEN 0 WHEN 'example.com' THEN 1 ELSE 2 END, sales DESC
数字越小优先级越高,这样就能实现多域名的层级排序。
进阶:确保同一parent_sku优先显示目标域名的字段
如果你的场景是同一个parent_sku对应多个domain的记录,希望分组后不仅排序优先,连domain、parent、parent_name这些非聚合字段也优先取themusthaves域名的值(避免数据库随机取值),可以用窗口函数先预处理数据:
WITH ranked_products AS ( SELECT *, -- 给每个parent_sku下的记录排名,目标域名排第一 ROW_NUMBER() OVER ( PARTITION BY parent_sku ORDER BY CASE WHEN domain = 'themusthaves' THEN 0 ELSE 1 END ) AS rn FROM report_byproducts_name ) SELECT domain, parent, parent_name, parent_sku, SUM(qty) AS sales, SUM(gross) AS revenue, SUM(net) AS net_revenue, SUM(refund_qty) AS returns, created_at FROM ranked_products WHERE rn = 1 -- 只保留每个parent_sku的优先记录 GROUP BY parent_sku, domain, parent, parent_name, created_at ORDER BY CASE WHEN domain = 'themusthaves' THEN 0 ELSE 1 END, sales DESC LIMIT 50;
逻辑说明
- 先通过
ROW_NUMBER()窗口函数,给每个parent_sku下的记录按域名优先级排名,目标域名的记录排第一。 - 过滤掉排名大于1的记录,确保每个
parent_sku只保留目标域名的记录(如果存在),再进行聚合分组,这样展示的非聚合字段就会是你想要的域名对应的值。
内容的提问来源于stack exchange,提问作者Rakesh Sojitra
相关产品推荐
相关产品推荐

