0

わかりました、この質問では、結果をソートするためのアルゴリズムを作成する方法を考える必要があります.

問題を説明しましょう:

私はさまざまな料理のレシピ (2000 以上) を持っていますが、それらはさまざまな食材で構成されています。

3 つのテーブルを持つ:

dish
id | name

ingredient
id | name

dish_ingredient
id | id_dish | id_ingredient

私が作成したアプリケーションでは、ユーザーが持っているさまざまな食材を選択できるようになり、アプリは、持っている食材の数によって適切な料理のレシピを並べ替えて表示します。ここで、ユーザーが材料を選択して何らかの「重み」を追加するアルゴリズムが必要です。

今のところ機能する例: ユーザーが牛肉、ニンジン、タマネギ、塩、コショウの材料を選択すると、アルゴリズムはどのレシピにこれらの材料が含まれているか (すべてである必要はありません) を調べ、ユーザーが持っている材料で並べ替えます。したがって、このソートの最初のレシピは塩だけで、次に小麦粉と卵 (パンケーキのレシピ) がリストの最後にあり、ユーザーにとってより便利な牛肉のレシピがある可能性があります。

だから私の考えは、検索アルゴリズムが彼により適切なレシピを与えるように、ユーザーが自分の材料にいくつかの重みを加えることができるということです. 私が何を望んでいるのか理解できない場合は、www.mizicapogrnise.siでアプリケーションを見て (スロベニア語からあなたの言語に翻訳してください)、アプリが現在どのように機能するかを確認できます。

ご助力いただきありがとうございます。

4

1 に答える 1

3

成分を数える基本的なクエリは次のとおりです。

select di.id_dish, count(*) as NumIngredients
from dish_ingredient di join
     ingredient i
     on i.id = di.id_ingredient
group by di.id_dish;

caseクエリに句を導入することで、成分についてこれを変更できます。

select di.id_dish, count(*) as NumIngredients,
       sum(case when i.name = 'beef' then 2.0
                when i.name = 'salt' then 0.5
                . . .
           end) as SumWeights
from dish_ingredient di join
     ingredient i
     on i.id = di.id_ingredient
group by di.id_dish
order by SumWeights desc;

. . .SQL 構文の一部ではありません。これが発生する場合は、同様の行を記入する必要があります。

別の定式化は、情報をサブクエリに入れることです。サブクエリには、各成分の重量が含まれています。次に、これをdish_ingredientテーブルに結合して、各料理の各材料の重量を取得します。外側のクエリは、料理ごとに結果を集計します。

select di.id_dish, count(*) as NumIngredients,
       sum(w.weight) as SumWeights
from dish_ingredient di join
     ingredient i
     on i.id = di.id_ingredient left outer join
     (select 'beef' as name, 2.0 as weight union all
      select 'salt', 0.5 union all
      . . .
     ) w
     on i.name = w.name
group by di.id_dish
order by SumWeights desc;

どちらの方法でも、クエリを変更して、必要な重み情報をデータベースに取得する必要があります。

于 2013-06-08T14:33:51.930 に答える