1

SQLLiteデータベースに2つのテーブルがあります。入力した材料で作れる飲み物を取り戻そうとしています。

私はこのクエリを作成して、必要なものを取得しようとしています。

テーブルドリンク

drink_id | タイトル| 材料| 道順| 成分数

サンプル行は次のようになります

1 | パパスマーフ| 砕いた青いアイスキャンディー1個、8オンスのクールエイド、4オンスのウォッカ| 道順| 3

テーブルの材料

drink_id | 成分

サンプル行は次のようになります

1 | 青いアイスキャンディー

現時点での私のクエリ

これは、私が返したいものの部分的な擬似コードです(これを取得した後、動的にクエリを実行します)。

入力量が飲み物の材料数以上で、入力された材料が飲み物に必要なすべての材料と一致するすべての飲み物を返却したいと思います。

SELECT drinks.title, drinks.ingredients, drinks.directions
FROM drinks, (SELECT count(ingredients._id) as ingredientNumber FROM ingredients
WHERE ingredients.ingredient LIKE '%rum%'
GROUP BY ingredients._id) as foundIngredients
WHERE drinks.ingredientsNum = foundIngredients.ingredientNumber;

誰かが私に最適なクエリを取得するために、またはデータベースモデルを再構築するためのヒントを与えるために私を助けることができますか?このデータベースは、80k行の長いJSONファイルから作成しました。

4

2 に答える 2

1

スキーマは少し奇妙です。通常、実際には3つのテーブルを使用して、このデータ構造(drinks、components、drink_ingredientsなど)を真に正規化します。ただし、テキスト検索を実行していて、飲み物のテーブルにすべての材料名がすでに含まれているため、飲み物のテーブルでクエリを実行するだけです。

SELECT title, ingredients, directions
FROM drinks
WHERE ingredients LIKE '%rum%'
AND ingredients LIKE '%vodka%'
... // add more ingredients as needed 

材料フィールドにインデックスがあることを確認してください。ラム酒やウォッカを含むすべての飲み物を返却ANDする場合は、をに変更できることに注意してください。OR

于 2012-12-05T01:10:59.000 に答える
1

明確な質問を反映したクエリ:

SELECT drinks.title, drinks.ingredients, drinks.directions
FROM drinks
WHERE drinks.ingredientsNum = (
    SELECT count(*)
    FROM ingredients
    WHERE (
        ingredients.ingredient LIKE '%rum%'
        OR ingredients.ingredient LIKE '%coke%'
        OR ingredients.ingredient LIKE '%vodka%'
        -- the same goes for each ingredient
    )
    AND ingredients.drink_id = drinks.drink_id
)

同様に、飲み物に指定されたすべて以外の追加の成分を含めることを許可する場合:

SELECT drinks.title, drinks.ingredients, drinks.directions
FROM drinks
WHERE drinks.ingredientsNum >= [number of input ingredients]
AND [number of input ingredients] <= (
    SELECT count(*)
    FROM ingredients
    WHERE (
        ingredients.ingredient LIKE '%rum%'
        OR ingredients.ingredient LIKE '%coke%'
        OR ingredients.ingredient LIKE '%vodka%'
        -- the same goes for each ingredient
    )
    AND ingredients.drink_id = drinks.drink_id
)
于 2012-12-05T01:18:10.123 に答える