[英]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.