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