Maison  >  Questions et réponses  >  le corps du texte

Réécrivez le titre comme suit : Si les données sont déjà insérées ou non dans la table A dans MySQL, insérez un identifiant de la table A dans la table B.

Je code depuis environ un an maintenant et je travaille actuellement sur un portfolio (un site de recettes) mais je suis bloqué et je ne sais pas comment procéder.

Mon problème est que je dois trouver un moyen d'insérer un identifiant d'ingrédient auto-incrémenté du tableau A (qu'il soit inséré ou non) dans le tableau B.

Lorsqu'une recette est soumise, j'ai configuré un code qui utilise la requête MySQL suivante pour vérifier s'il y a des ingrédients soumis dans ma table d'ingrédients.

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

J'ai d'abord essayé d'utiliser un déclencheur post-insertion, mais j'ai réalisé que cette approche ne fonctionnerait pas si l'ingrédient existe déjà dans la base de données et n'est pas nouvellement inséré. Par conséquent, je pense que mon approche devra peut-être être remaniée.

Mon objectif est, lors de la soumission d'une recette, de compiler l'ingrédient dans un tableau, en utilisant le code suivant :

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

Ensuite, exécutez la requête MySQL et insérez l'ingrédient dans le tableau A s'il n'existe pas déjà, ou ignorez-le s'il existe déjà. Après ces deux options, l'identifiant auto-incrémenté de l'ingrédient sera inséré dans le tableau B. Pour compliquer le problème, recette_id sera extrait de la table C (contenant diverses autres informations sur la recette), montant sera la valeur saisie par l'utilisateur dans le champ de saisie (convertie en tableau), unit_id sera celle sélectionnée par le utilisateur et prédéfini dans la base de données Un ensemble d'unités correspondant à un ensemble prédéfini d'unités de mesure (également converties en tableau). Ces deux tableaux seront transformés en tableaux en utilisant le code JavaScript ci-dessus.

Le Tableau A est le suivant :

id Ingrédients
1 Sucre
2 farine

Le tableau B est le suivant :

id recipe_id Montant id_unité ingredient_id
1 45 1 5 1
2 76 4 4 2

Méthode mise à jour

J'espère que c'est une meilleure façon, cependant, j'ai du mal à comprendre comment exécuter le faux résultat de mon instruction if @checkIngredientFalse,然后执行@checkIngredientTrue方面遇到了困难,因为这将会将ingredient的id添加到recipe_ingredientsingredient_iddans la colonne du tableau.

recette.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 Il y a quelques jours516

répondre à tous(1)je répondrai

  • P粉366946380

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

    Pour chaque ingrédient de la recette :

    • SELECT id FROM ingredients WHERE ingredient = ?
    • Si la requête ci-dessus réussit, définissez ingredient_id sur l'identifiant renvoyé
    • En cas d'échec, exécutez INSERT INTO ingrédients (ingrédient) VALUES (?) et définissez INSERT INTO ingredients (ingredient) VALUES (?),并将ingredient_id sur l'ID d'incrémentation automatique attribué
    • Utilisez la valeur ingredient_id值进行INSERT INTO recipes trouvée dans les étapes ci-dessus pour les recettes INSERT INTO
    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]);
    });

    répondre
    0
  • Annulerrépondre