繁体   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