0

私は私の質問の説明を肉屋にしないことを願っています:

何百もの行を持つテーブルがあります。各行は栄養情報を含むレシピです。たとえば、次のようになります。

レシピテーブル:

id  | calories | protein| carbs | fat

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

私は、recipe_table 内のすべてのレシピのすべての可能な組み合わせを 3 つのセットとして表示する新しいテーブル (recipe_index) を作成する必要があったため、次のようになります。

レシピ_インデックス:

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

基本的には、recipe_index をクエリして、「合計値が 440 カロリーから 460 カロリーになるレシピの 3 つの組み合わせはどれか」と言うことができます。

これを行うための私の現在のコードは 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 が順番に並んでいる条件が必要です (これにより、1 つのレシピが 3 回表示されることも防止されます)。

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 に答える