4

レシピのデータベースがあり、持っている材料に基づいてそれらを検索したいとします。

3 つのテーブルが必要です。

レシピ (rid、rname)、
材料 (iid、iname)、
関係 (rid、iid)

次に、「トースト」のレシピと「パンとバターのプリン」のレシピがあると想像してみましょう - トーストには 2 つの材料 (パンとバター) があります - プリンにはパンとバターに加えて、小麦粉、卵、水が含まれる場合があります - というわけで全部で5つ。

私の問題は、検索で提供される要素に基づいて SQL クエリを構造化することです。検索で 3 つの材料 (パン、バター、卵) を送信した場合、(説明した 2 つのレシピから) トーストという 1 つの結果のみが生成されます。- プリンを作る材料が足りないから!

では、そのような SQL クエリは実際にはどのように見えるのでしょうか? 私はすべてを試し、すべてをグーグルで検索しましたが、今では私の脳はそれを処理できません.

4

4 に答える 4

1

これが最善の方法かどうかはわかりませんが、あなたが示した例ではうまくいきます:

SELECT
    *
FROM
    recipes
WHERE
    rid NOT IN (
        /* exclude all recipes with other ingredients */
        SELECT rid FROM relationship WHERE iid NOT IN (1, 2, 4)
    )

私の英語でごめんなさい=)

編集: 材料の ID は質問と同じ順序であるため、1 はパン、2 はバター、4 は卵です。

"iid";"iname" "1";"パン" "2";"バター" "3";"小麦粉" "4";"卵" "5";"水"

于 2011-09-01T21:43:19.127 に答える
0

のリストが(1,2,3) であると仮定すると、 が (1,2,3) にあり、 が含まれている場所iidsからすべてを選択してみてください(カウント <=リストの数を持つの選択)。relationshipiidridridsrelationshipiids

于 2011-09-01T21:34:42.593 に答える
0

「ids」が検索成分 ID を保持しているとします。

SELECT *
FROM Recipes
WHREE rid NOT IN (SELECT DISTINCT rid FROM Relationship WHERE iid NOT IN (ids))
于 2011-09-01T21:35:45.843 に答える
0

私の答えは、PDO を使用していることを前提としていますが、基本的な mysql または mysqli 呼び出しを使用する場合は、必要に応じて変更します。

$ingredient1 = $_POST['ingredient1'];
$ingredient2 = $_POST['ingredient2'];
$ingredient3 = $_POST['ingredient3'];

$sql = '
SELECT
 c.rid,
 c.rname
FROM ingredients a
JOIN relationship b ON (a.iid = b.iid)
JOIN recipes c ON (b.rid = c.rid)
WHERE
     (a.iname LIKE ? AND a.iname LIKE ? AND a.iname LIKE ?)
';

$stmt = $db->prepare($sql)
$stmt->execute(array('%'.$ingredient1.'%', '%'.$ingredient2.'%', '%'.$ingredient3.'%'));

私の答えは、もちろん、ステートメントには常に 3 つのレシピが含まれ、post 変数を使用しているが、可変性に対応するように変更できることを前提としています。このタイプのクエリの利点は、与えられた他のクエリとは対照的に、従来より効率の低いサブクエリを使用する必要がないことです。

編集

配列値に「%」記号を追加するのを忘れていました。これは、対応する表にある成分名と一致します。一致する必要がある場合は、単に「LIKE」記号と「%」記号を削除し、「= ?」を配置します。

于 2011-09-01T21:43:27.010 に答える