日期:2014-05-18  浏览次数:20523 次

关于数据库的排列组合选法
想做个关于教用户做菜的程序……遇到一个排列组合的问题
问题描述:用户勾选自己已有的食材,然后程序给出根据食材可以做的菜的列表
如: 用户选择了 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]
go
if object_id('[tbl]') is not null 
drop table [tbl]
go
create table [tbl](
[菜号] int,
[菜名] varchar(5),
[所需食材] varchar(3),
[做法] varchar(5)
)
go
insert [tbl]
select 1,'菜名1','A','做法1' union all
select 2,'菜名2','ABD','做法2' union all
select 3,'菜名3','ABC','做法3' union all
select 4,'菜名4','CD','做法4' union all
select 5,'菜名5','BC','做法5'

go
if OBJECT_ID('p_tracy')is not null
drop proc p_tracy
go
create proc p_tracy @材料 varchar(10)
as
declare @str varchar(200)
set @str='select * from tbl where
charindex([所需食材],'+QUOTENAME(@材料,'''')+')>0'
PRINT @STR
exec(@str)


exec p_tracy 'ABC'

/*
菜号    菜名    所需食材    做法
1    菜名1    A    做法1
3    菜名3    ABC    做法3
5    菜名5    BC    做法5
*/