0

我希望我不会扼杀我的问题的解释:

我有一个有数百行的表,每一行都是一个带有营养信息的食谱,例如:

食谱表:

id  | calories | protein| carbs | fat

recipe1, 100,    20g,     10g,     2g
recipe2, 110,    10g,     12g,     12g
recipe3, 240,    20g,     1g,      23g
....

我需要创建一个新表 (recipe_index),它将 recipe_table 中每个食谱的所有可能组合显示为一组 3,所以它看起来像:

食谱索引:

id1     | id2    | id3    |calories| protein | carbs | fat
recipe1, recipe2, recipe3,   450,     50g,      23g,   37g
....

基本上它允许我查询 recipe_index 并说“哪 3 种食谱组合的总价值在 440 卡路里和 460 卡路里之间”

我当前执行此操作的代码适用于 3 顿饭,但是我最终在 recipe_index 中有大约 450,000 条记录,我也需要为 4,5 和 6 顿饭做同样的事情,所以我在计算数百万条记录这结束了。有没有更有效的方法来做到这一点?也许我需要研究为每个范围划分一个表?

我当前的 SQL 代码:

INSERT INTO recipe_index
SELECT distinct '3' as nummeals, t1.id as id1, t2.id as id2, t3.id as id3, 0 as id4,   
t1.calories_ps+t2.calories_ps+t3.calories_ps as calories, t1.protein_ps+t2.protein_ps+t3.protein_ps as  
protein, t1.carbohydrate_ps+t2.carbohydrate_ps+t3.carbohydrate_ps as carbohydrate, 
t1.fat_ps+t2.fat_ps+t3.fat_ps as fat from recipes t1 inner join  recipes t2  on t1.Id < t2.Id inner join  recipes t3  on t2.Id < t3.Id WHERE t1.image <> '' AND t2.image <> '' AND t3.image <> ''

如果我错过了任何明显的事情,请告诉我

4

1 回答 1

1

你可以通过加入来做到这一点。为了防止重复,您需要一个配方 ID 有序的条件(这也可以防止一个配方出现三次):

select r1.id, r2.id, r3.id,
       (r1.calories + r2.calories + r3.calories) as calories,
       (r1.protein + r2.protein + r3.protein) as protein,
       (r1.carbs + r2.carbs + r3.carbs) as carbs,
       (r1.fat + r2.fat + r3.fat) as calories
from recipe_table r1 join
     recipe_table r2
     where r1.id < r2.id join
     recipe_table r3
     where r2.id < r3.id;

与您的查询的唯一区别distinct是不需要,因为排序可以防止重复。

您面临的问题是有很多组合。所以有 4 种食谱的数百万种组合。我猜你是从 77 个左右的食谱开始的。其中 4 个组合的数量为 77*76*75*74——对于 5 个和 6 个组合,这个序列将快速增长。

于 2013-05-30T18:44:34.357 回答