有一个兑换功能,表格大概如下:
users(用户表)
+-----------------------+
| id name |
| 1 admin |
| 2 guest |
| 3 home |
+-----------------------+
goods(商品表)
+-----------------------+
| id name |
| 1 A |
| 2 B |
| 3 C |
| 4 D |
+-----------------------+
buy_history(用户购买记录表)
+-------------------------+
| user_id good_id number |
| 1 1 10 |
| 1 2 20 |
| 1 3 19 |
| 2 4 47 |
+-----------------------+
explains(兑换规则表)
+-------------------------------------------------+
| combination combination_number good_id number |
| 1 10 2 1 |
| 1,2 15 1 2 |
| 1,2,3 30 3 2 |
| 2,3 20 2 2 |
+-------------------------------------------------+
这个表的记录意思是:
explains.combination
是需要组合的 id,简单的说明。
如第一条记录是指商品 1 买够了 10 个数量,可以兑换商品 2 数量 1 个.
第二条记录是指,买够了商品 1 或者 2 加起来总共有 15 个的可以兑换商品 1 数量 2 个
第三条记录是指,买够了商品 1 或者 2 或者 3 总共有 30 个的可以兑换商品 3 数量 2 个。
业务是这样的:
用户每次买了商品之后,在购买记录表记录下数量,然后管理员可以添加任意种组合到兑换规则表,需要组合的商品有可能是一个或者多个商品的 id(explains.ombination
),但是可以兑换的商品( good_id )只会只一个。
现在我想的是先用编程语言计算好所有排列组合, 如上面的用户购买记录表,可以得出用户 1 的组合是:
# 用户 1 的购买记录
| 1 1 10 |
| 1 2 20 |
| 1 3 19 |
# 得出所有的集合,key 是 combination 组合,value 是数量
| 1 => 11 | 2 => 20 | 3 => 19 | 1,2 => 30 | 1,3 => 29 | 2,3 => 39 | 1,2,3 => 49|
组合的个数是这样的:
Cn1 + Cn2 + Cn3 + Cn4 + Cn(n-1)
然后再用所有的组合key
,whereIn
一下explains.combination
组合,再遍历每一条记录中需要的combination_number
,然后得出符合条件的。
有做过这方面的朋友可以指教一下?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.