簡體   English   中英

在一個查詢中更新(或插入)多行

[英]update (or insert) multiple rows in one query

我試圖在給定設置和用戶ID數組的情況下一次更新表中的多行(如果不存在,則將其插入)。

如何從settings表中為特定帳戶的特定計算機的所有用戶選擇所有行的示例。 這是結果集,我需要在其中插入值或更新它們(如果存在)。

$stmt = $db->prepare("      
    SELECT settings.*
    FROM
        ( SELECT  account_id, computer_id
            FROM computers
            ORDER BY computer_id ASC LIMIT 0, ".$_SESSION['user']['licenses']."
        ) as c
        LEFT JOIN users
            on users.computer_id = c.computer_id
        LEFT JOIN accounts
            on accounts.account_id = c.account_id
        LEFT JOIN settings
            on settings.user_id = users.user_id
    WHERE accounts.account_id = ".$_SESSION['user']['account_id']."
");

我正在嘗試做的事情:我正在嘗試僅在陣列中列出的那些用戶ID的settings表中更新/插入三列(啟用,狀態和user_id)。 所有人的啟用值和狀態值都相同,但是每個用戶名和用戶名都不同。

$ users = array(12、36、43、56、76)

$ binding = array('enabled'=> 1,'status'=> 2,'user_id'=> from array );

如果我的想法正確,則可以從上面列出的語句中創建一個虛擬表,然后使用ON DUPLICATE KEY UPDATE插入/更新該虛擬表的結果?

這可能嗎? 如果是這樣,示例,提示或指向正確的方向? 我的工作方式涉及給定數組中每個用戶ID的foreach循環,因此將有x個查詢,具體取決於其數量。 如果我只能將其削減為一個,那將是很棒的!

更新:

好的,我現在完全感到困惑...這是對定義的值的嘗試,它不起作用...並且如上所述,我仍然需要一種方法來對數組中的每個user_id進行操作。 我是否也不需要將整個FROM子句“保存”為新引用?

$stmt = $db->prepare("
    INSERT INTO settings (user_id, enabled, status)
    VALUES (:user_id, :enabled, :alert_user)    
    SELECT user_id, enabled, status
    FROM
        ( SELECT  account_id, computer_id
            FROM computers
            ORDER BY computer_id ASC LIMIT 0, ".$_SESSION['user']['licenses']."
        ) as c
        LEFT JOIN users
            on users.computer_id = c.computer_id
        LEFT JOIN accounts
            on accounts.account_id = c.account_id
        LEFT JOIN settings
            on settings.user_id = users.user_id
        WHERE accounts.account_id = ".$_SESSION['user']['account_id']."
    ON DUPLICATE KEY UPDATE enabled = VALUES(enabled), status = VALUES(status)  
");

$binding = array(
    'enabled' => 1,
    'alert_user' => 4,
    'user_id' => 6
    );

$stmt->execute($binding);

是的,您的想法是正確的。 應該是這樣的:

INSERT INTO settings (user_id, enabled, status)
SELECT user_id, enabled, status
FROM ... -- rest of your query here
ON DUPLICATE KEY UPDATE enabled = VALUES(enabled), status = VALUES(status)

ON DUPLICATE KEY UPDATE子句中的VALUES(colname)獲取如果沒有ON DUPLICATE KEY UPDATE則將插入的值。

好的,根據您的評論,我認為這可能是您想要的:

INSERT INTO settings (user_id, enabled, status)
SELECT :user_id, :enabled, :status
FROM ...
JOIN ...
JOIN ...
WHERE ...
ON DUPLICATE KEY UPDATE enabled = VALUES(enabled), status = VALUES(status)

如果聯接返回任何行,這將插入或更新指定的行。 如果找不到任何行,則不會進行插入/更新。

如果您不希望在連接的表中沒有匹配項時返回任何內容,則應該使用內部連接而不是左連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM