找到每种可能组合的更有效方法

时间:2012-10-23 22:28:24

标签: sql math cartesian

这对我来说有点难以解释,我试图获得所有可能的数字组合,而只使用一次数字,例如,如果我有数字1到10并且想要独特的组合3人小组:

1,2,3
4,5,6
7,8,9

这些都很好,但我目前正在对某些桌子进行笛卡尔连接,所以对于我得到的第一组:

1,2,3
3,2,1
1,3,2
2,3,1
2,1,3 

等...因为我已经使用了1,2,3一次,所以我不想要它的所有其他组合。

这是我目前正在使用的代码,我不太确定如何在SQL中执行我想要的操作。 id1,id2,id3是我试图找到所有可能组合的3个数字。

INSERT INTO recipe_index
SELECT distinct '3' as nummeals, t1.id as id1, t2.id as id2, t3.id as id3,   
t1.calories+t2.calories+t3.calories as calories, t1.protein+t2.protein+t3.protein as  
protein, t1.carbohydrate+t2.carbohydrate+t3.carbohydrate as carbohydrate, 
t1.fat+t2.fat+t3.fat as fat from recipes t1, recipes t2, recipes t3

我希望我在这里想要实现的目标是有道理的。

2 个答案:

答案 0 :(得分:3)

INSERT INTO recipe_index
SELECT t1.Id as t1Id, t2.id as t2Id, t3.id as T3id
   t1.calories+t2.calories+t3.calories as calories, 
   t1.protein+t2.protein+t3.protein as protein, 
   t1.carbohydrate+t2.carbohydrate+t3.carbohydrate as carbohydrate, 
   t1.fat+t2.fat+t3.fat as fat 
FROM recipes t1
JOIN recipes t2 on T2.id < t1.Id
JOIN recipes t3 on t3.id < t2.id

这将产生在所有配方ID中采用的三个ID的所有组合,而不产生任何重复(如果我们认为重复也包括相同ID但顺序不同的序列)。

现在,如果我理解了这个问题,我们想要将recipe_index的所有行组合拉出一次,只使用一次。 (注意,只使用所有 ID一次且仅使用一次,这意味着食谱的数量是3的倍数。)

答案 1 :(得分:1)

我不知道这有多好,但是做的是:

INSERT INTO recipe_index
SELECT distinct '3' as nummeals, t1.id as id1, t2.id as id2, t3.id as id3,   
t1.calories+t2.calories+t3.calories as calories, t1.protein+t2.protein+t3.protein as  
protein, t1.carbohydrate+t2.carbohydrate+t3.carbohydrate as carbohydrate, 
t1.fat+t2.fat+t3.fat as fat from recipes t1 inner join  recipes t2  on t1.Id < t2.Id inner join  recipes t3  on t2.Id < t3.Id