Heim  >  Fragen und Antworten  >  Hauptteil

Schreiben Sie den Titel wie folgt um: Wenn Daten bereits in Tabelle A in MySQL eingefügt sind oder nicht, fügen Sie eine ID aus Tabelle A in Tabelle B ein

Ich programmiere jetzt seit etwa einem Jahr und arbeite derzeit an einem Portfolio (einer Rezept-Website), aber ich stecke fest und weiß nicht, wie ich vorgehen soll.

Mein Problem ist, dass ich eine Möglichkeit finden muss, eine automatisch inkrementierende Zutaten-ID aus Tabelle A (ob eingefügt oder nicht) in Tabelle B einzufügen.

Wenn ein Rezept eingereicht wird, habe ich Code eingerichtet, der die folgende MySQL-Abfrage verwendet, um zu prüfen, ob meine Zutatentabelle eingereichte Zutaten enthält.

SELECT 
        i.ingredient
    CASE
        WHEN 
            LOWER(?) = LOWER(ingredient) 
            THEN INSERT IGNORE INTO 
                i (ingredient) VALUES ?
        ELSE 
            LOWER(?) != LOWER(ingredient)
            THEN INSERT INTO
                i VALUES ?
    END
FROM
    ingredients i

Ich habe zunächst versucht, einen Post-Insert-Trigger zu verwenden, habe aber festgestellt, dass dieser Ansatz nicht funktionieren würde, wenn die Zutat bereits in der Datenbank vorhanden ist und nicht neu eingefügt wird. Daher denke ich, dass mein Ansatz möglicherweise überarbeitet werden muss.

Mein Ziel ist es, beim Einreichen eines Rezepts die Zutat in einem Array zusammenzustellen, indem ich den folgenden Code verwende:

let ingredients = req.body.ingredients;
    let ingredientArray = Array();
    ingredients.forEach(ingredient => {
        ingredientArray.push([ingredient.ingredient]);
    });

Führen Sie dann die MySQL-Abfrage aus und fügen Sie die Zutat in Tabelle A ein, falls sie noch nicht vorhanden ist, oder ignorieren Sie sie, wenn sie bereits vorhanden ist. Nach diesen beiden Optionen wird die automatisch inkrementierende ID der Zutat in Tabelle B eingefügt. Um das Problem noch komplizierter zu machen, wird „recipe_id“ aus Tabelle C (die verschiedene andere Rezeptinformationen enthält) extrahiert, „amount“ ist der vom Benutzer in das Eingabefeld eingegebene Wert (in ein Array konvertiert), „unit_id“ ist der vom Benutzer ausgewählte Wert Benutzerdefiniert und in der Datenbank vordefiniert. Ein Satz von Einheiten, der einem vordefinierten Satz von Maßeinheiten entspricht (ebenfalls in ein Array konvertiert). Diese beiden Arrays werden mithilfe des obigen JavaScript-Codes in Arrays umgewandelt.

Tabelle A lautet wie folgt:

id Zutaten
1 Zucker
2 Mehl

Tabelle B lautet wie folgt:

id recipe_id Betrag unit_id Zutaten_ID
1 45 1 5 1
2 76 4 4 2

Aktualisierte Methode

Hoffentlich ist dies ein besserer Weg, aber ich habe Schwierigkeiten herauszufinden, wie ich das falsche Ergebnis meiner if-Anweisung in der Tabellenspalte ausführen kann. @checkIngredientFalse,然后执行@checkIngredientTrue方面遇到了困难,因为这将会将ingredient的id添加到recipe_ingredientsingredient_id

recipe.js

async function createRecipeIngredient(newRecipeId, ingredientName, unitId, amount) {
    let ingredients = req.body.ingredients;
    let ingredientArray = Array();
    ingredients.forEach(ingredient => {
        ingredientArray.push([ingredient.ingredient]);
    });

const ingredientQuery = `
SET @checkIngredient = 
    (SELECT 
        i.id 
    FROM 
        ingredients i 
    WHERE 
        i.ingredient = LOWER(?)
    );

SET @newRecipeId = 
    (SELECT
        max(r.id)
    FROM
        recipes r
    );
    
SET @checkIngredientTrue = 
    (INSERT INTO
        recipeIngredients (recipe_id, ingredient_id)
    VALUES
        (@newRecipeId, @checkIngredient)
    );

SET @checkIngredientFalse = 
    (INSERT INTO 
        ingredients (ingredient) 
    VALUES 
        (LOWER(?))
    
    //MISSING CODE HERE//

    );

IF(@checkIngredient, @checkIngredientTrue, @checkIngredientFalse);`

const [_queryRows, _queryFields] = await db.promise().query(ingredientQuery, [newRecipeId, _ingredientName, _unitId, _amount]);

module.exports = { getRecipe, getRecipeComments, getRecipePhotos, getUserRecipeCommentLikes, createRecipe, insertRecipePhoto, createRecipeIngredient };

routerRecipes.js

router.post('/recipes/new', cloudinary.upload.single('photo'), async (req, res, _next) => {
    await recipeQueries.createRecipe();
    await recipeQueries.insertRecipePhoto(newRecipeId, req.user, req.file.path);
    await recipeQueries.createRecipeIngredient(newRecipeId);

    res.redirect('/recipes');
});

P粉716228245P粉716228245404 Tage vor512

Antworte allen(1)Ich werde antworten

  • P粉366946380

    P粉3669463802023-09-12 10:45:04

    对于食谱中的每个成分:

    • SELECT id FROM ingredients WHERE ingredient = ?
    • 如果上述查询成功,则将ingredient_id设置为返回的id
    • 如果不成功,则执行INSERT INTO ingredients (ingredient) VALUES (?),并将ingredient_id设置为分配的自增ID
    • 使用上述步骤中找到的ingredient_id值进行INSERT INTO recipes
    ingredients.forEach(async (ingredient) => {
        let ingredient_id;
        const [ing_ids] = await db.promise().query("SELECT id FROM ingredients WHERE ingredient = ?", [ingredient.toLowerCase()]);
        if (ing_ids.length > 0) {
            ingredient_id = ing_ids[0][0];
        } else {
            const res = await db.promise().query("INSERT INTO ingredients (ingredient) VALUES (?)", [ingredient]);
            ingredient_id = res.insertId;
        }
        await db.promise().query("INSERT INTO recipeIngredients (recipe_id, ingredient_id) VALUES (?, ?)", [recipe_id, ingredient_id]);
    });

    Antwort
    0
  • StornierenAntwort