搜尋

首頁  >  問答  >  主體

將標題重寫為:如果在MySQL中資料已經插入或未插入到表A中,請將表A中的一個id插入到表B中

我現在已經編碼了大約一年了,目前我正在做一個作品集(一個食譜網站),但我陷入了困境,不確定該如何繼續。

我的問題是,我需要找到一種方法,將表A中的自動遞增的ingredient id(無論是否插入)插入到表B中。

提交食譜時,我已經設定了程式碼,它會使用以下MySQL查詢來檢查我的ingredients表中是否有提交的ingredient。

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

我最初嘗試使用插入後觸發器,但意識到如果ingredient已經存在於資料庫中並且不是新插入的,這種方法將不起作用。因此,我認為我的方法可能需要重構。

我的目標是,當提交食譜時,將ingredient編譯成一個數組,並使用以下程式碼:

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

然後執行MySQL查詢,如果ingredient尚未存在,則將其插入到表A中,如果已經存在,則忽略。在這兩個選項之後,ingredient的自動遞增id將會插入表B。為了讓問題更複雜,recipe_id將從表C中提取(包含其他各種食譜資訊),amount將是使用者在輸入欄位中鍵入的值(轉換為陣列),unit_id將是使用者選擇的與資料庫中預先定義的一組預先定義的測量單位相對應的單位(也轉換為數組)。這兩個陣列將使用上面的JavaScript程式碼使它們成為陣列。

表A如下:

id 成分
1
2 麵粉

表B如下:

id recipe_id 金額 unit_id ingredient_id
1 45 1 5 1
2 76 4 4 2

更新的方法

#希望這是一個更好的方法,但是,我在弄清楚如何使我的if語句的false結果執行@checkIngredientFalse,然後執行@checkIngredientTrue方面遇到了困難,因為這會將ingredient的id加入到recipe_ingredientsingredient_id表格列中。

食譜.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粉716228245448 天前539

全部回覆(1)我來回復

  • 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]);
    });

    回覆
    0
  • 取消回覆