首页 > 解决方案 > 如何使用mysql和php实现基于成本的单表排列组合?

问题描述

我有一张桌子

表名:sample_records

sr_id | skuid | price
----------------------
   1  | SKOO1 | 12
   2  | SKOO2 | 7
   3  | SKOO3 | 56
   4  | SKOO4 | 3 
   5  | SKOO5 | 23
   6  | SKOO6 | 50 
   7  | SKOO7 | 34
   8  | SKOO8 | 5 
   9  | SKOO9 | 23
   10 | SKO10 | 56 
   11 | SKO11 | 101
   12 | SKO12 | 4 
   13 | SKO13 | 23
   14 | SKO14 | 56

现在我需要一个基于价格的组合。假设我将成本设为 500。以下是预期结果:

ROW | skuid             | quantity  | cost |
---------------------------------------------
 1  | SKOO1             |    41     |  492
--------------------------------------------- 
 2  | SKOO1,SKOO2       |    41,1   |  497
--------------------------------------------- 
 3  | SKOO1,SKOO2       |    40,2   |  494
--------------------------------------------- 
 4  | SKOO1,SKOO2,SKOO8 |    40,2 1 |  499
---------------------------------------------
 .
 .
 .

结果应该得到所有组合.. 注意:-

  1. 数量和成本是动态添加的列。

请帮我找到一个可行的解决方案。

标签: phpmysqlsqlcombinationspermutation

解决方案


您可以使用递归 CTE 来获取排列:

with recursive cte as (
      select cast(skuid as char(1000)) skuids, price, skuid as max_skuid
      from sample
      where price < 50
      union all
      select concat_ws(',', cte.skuids, s.skuid), cte.price + s.price, s.skuid
      from cte join
           sample s
           on s.skuid > cte.max_skuid and
              s.price + cte.price < 50
     )
select *
from cte;

是一个 db<>fiddle。


推荐阅读