想做个关于教用户做菜的程序……遇到一个排列组合的问题
问题描述:用户勾选自己已有的食材,然后程序给出根据食材可以做的菜的列表
如: 用户选择了 A B C 3种食材(你可以想象成蕃茄,土豆,牛肉)
那么系统应该 列出包含 A, B , C , AB , AC ,BC, ABC 的菜 ,但是像什么 ABD,AD之类的是肯定不会列出来的, 也就是说系统会将用户勾选的食材进行排列组合,根据所有排列组合列出对应菜名,但是菜的素材单若有用户未勾选的食材,那么是剔除在外的。
菜号 菜名 所需食材 做法
1 菜名1 A 做法1
2 菜名2 A B D 做法 2
3 菜名3 A B C 做法 3
4 菜名4 C D 做法 4
5 菜名5 B C 做法 5
如果用户选择了A B,C 3种食材,那么系统应该给出 1 , 3 ,5 3道菜…………
问题是如何用SQL语句将他们选择出来???
------解决方案--------------------
- SQL code
--> 测试数据:[tbl]goif object_id('[tbl]') is not null drop table [tbl]gocreate table [tbl]([菜号] int,[菜名] varchar(5),[所需食材] varchar(3),[做法] varchar(5))goinsert [tbl]select 1,'菜名1','A','做法1' union allselect 2,'菜名2','ABD','做法2' union allselect 3,'菜名3','ABC','做法3' union allselect 4,'菜名4','CD','做法4' union allselect 5,'菜名5','BC','做法5'goif OBJECT_ID('p_tracy')is not nulldrop proc p_tracygocreate proc p_tracy @材料 varchar(10)asdeclare @str varchar(200)set @str='select * from tbl wherecharindex([所需食材],'+QUOTENAME(@材料,'''')+')>0'PRINT @STRexec(@str)exec p_tracy 'ABC'/*菜号 菜名 所需食材 做法1 菜名1 A 做法13 菜名3 ABC 做法35 菜名5 BC 做法5*/