SQL - 查找所有可能的组合

时间:2010-12-04 06:24:02

标签: sql

我需要帮助在数据库中找到所有可能的值组合,例如我有这个表:

ITEM_SET           Support  
I1               0.244999999
I2               0.274999999     
I3               0.258333333    
I4               0.103333333  

我需要找到所有可能的组合:

I1,I2    I1,I2,I3    I1,I2,I3,I4
I1,I3    I1,I2,I4
I1,I4    I1,I3,I4
I2,I3    I2,I3,I4
I2,I4 
I3,I4

*请注意,这种格式只是为了帮助阅读,因为我需要的只是一个可能的组合列表,如下表:

ITEMSET
I1               
I2                    
I3                 
I4  
I1,I2    
I1,I3    
I1,I4    
I2,I3    
I2,I4 
I3,I4
I1,I2,I3 
I1,I2,I4 
I1,I3,I4 
I2,I3,I4   
I1,I2,I3,I4

2 个答案:

答案 0 :(得分:3)

你建议的是一个n!长度为1-n的所有元素的组合。忽略使用代码生成器创建元素的可能性,你可以为每个组合做这样的事情(在MySQL中):

一项:

SELECT item from ITEM_SET;

两项:

SELECT one.item,two.item from ITEM_SET as one, ITEM_SET as two where one.item != two.item;

三项:

SELECT one.item,two.item,three.item from ITEM_SET as one, ITEM_SET as two, ITEM_SET as three where one.item != two.item and one.item != three.item and two.item != three.item;

冲洗并重复。为了迂腐,我将 ITEM_SET 定义为我的表名,将 item 定义为我的属性,这是一个更有意义的表组合。

这个和相关的问题对我来说是代码味道。如果您以编程方式为所有候选答案遍历所有元素排列,那么可能会有一个更简单的算法来解决您的问题。鉴于您的other question与此直接相关,也许您可​​以提供更多背景信息?

答案 1 :(得分:1)

生成组合的最简单算法之一是位计数 的伪代码

N items, indexed 1-N

for i=1 to 2^N-1 
   for each bit in i
      if bit is set, output item[i]

N = 4的例子:

N = 4, 2^4 = 16
i = 1:  binary = 00000001 -> output I1
i = 2:  binary = 00000010 -> output I2
i = 3:  binary = 00000011 -> output I1, I2
i = 4:  binary = 00000100 -> output I3
i = 6:  binary = 00000101 -> output I1, I3
i = 7:  binary = 00000111 -> output I1, I2, I3
i = 8:  binary = 00001000 -> output I4
i = 9:  binary = 00001001 -> output I1, I4
i = 10: binary = 00001010 -> output I2, I4
i = 11: binary = 00001011 -> output I1, I2, I4
i = 12: binary = 00001100 -> output I3, I4
i = 13: binary = 00001011 -> output I1, I2, I4
i = 14: binary = 00001110 -> output I2, I2, I4
i = 15: binary = 00001111 -> output I1, I2, I3, I4