【问题标题】:php - update sql statement with multiples rowsphp - 用多行更新 sql 语句
【发布时间】:2016-02-20 22:22:50
【问题描述】:

我知道这个问题已经存在,但我不知道如何在我的情况下解决它。我尝试将 UPDATE 语句与 sql 一起使用,但在处理多行时出现问题。

这是我的代码:

$body = file_get_contents('php://input');
$jsonArray = json_decode($body, true);

$sql = array();
foreach ($jsonArray as $row) {   

    $sql[] = '("'.$row['firstname'].'", "'.$row['lastname'].'", "'.$row['sex'].'", "'.$row['dateOfBirth'].'", "'.$row['email'].'")';

}

$column_name = "(firstname, lastname, sex, dateOfBirth, email)";
$stringImplode = implode(',', $sql);

$action = $mysqli->query('INSERT INTO tbl_syncList '. $column_name .' VALUES '.$stringImplode .'ON DUPLICATE KEY UPDATE XXXXXXX'); // --> I get stuck here

我不知道在 ON DUPLICATE KEY UPDATE 之后应该如何写:我知道它应该类似于“column_name = value1,column_name2 = value2 ...”,但是否可以以某种方式使用上面的数组比如 "(column_name1, column_name2...) = (value1, value2...) 如果我要添加多个属性可能会有用?

由于它位于循环之外,我不确定如何在 sql[] 数组中引用我的值,因为对于同一个 column_name 可能有很多不同的值。

此外,我想在末尾添加一个 WHERE 子句,例如“WHERE timestamp_column_name

如果有人可以帮助我解决这个问题,那就太好了。

【问题讨论】:

    标签: php mysql arrays row on-duplicate-key


    【解决方案1】:

    要回答您的第一个问题,您可以在 ON DUPLICATE KEY UPDATE 语句中使用 VALUES() :

    $action = $mysqli->query('INSERT INTO tbl_syncList '. $column_name .' VALUES '.$stringImplode .'ON DUPLICATE KEY UPDATE firstname = VALUES(firstname), lastname = VALUES(lastname), sex = VALUES(sex), dateofbirth = VALUES(dateofbirth), email = VALUES(email)');
    

    但是,我认为您的第二个问题无法使用这种方法解决。我的建议是首先将所有记录插入到一​​个暂存表中,该表对您要插入/更新的列没有任何唯一约束。然后使用进一步的查询(或者最好是数据库过程)根据表之间的连接以及您拥有的任何其他条件执行单独的更新和插入查询。

    我的 MySQL 有点生疏了,但我认为这应该是您将数据插入临时表后大致需要的:

    UPDATE a
    SET a.firstname = b.firstname,
        a.lastname  = b.lastname,
        a.sex       = b.sex,
        ...
    FROM stagingtable b
    JOIN tbl_syncList a ON a.idcolumn = b.idcolumn
    WHERE b.timestamp > a.timestamp
    
    INSERT tbl_syncList(firstname, lastname, sex, dateOfBirth, email)
    SELECT 
        b.firstname,
        b.lastname,
        b.sex,
        b.dateOfBirth,
        b.email
    FROM stagingtable b
    LEFT JOIN tbl_syncList a ON a.idcolumn = b.idcolumn
    WHERE a.idcolumn IS NULL
    

    【讨论】:

    • 谢谢,我试试看!
    • 你说得对,我不能使用相同的方法来更新数据。但我不明白为什么它不能与 WHERE 条件一起工作,如下所示: ON DUPLICATE KEY UPDATE firstname = VALUES(firstname), ... WHERE timestamp (i.e which is a database column_name)
    • 我不确定您的示例中的表“a”是什么,它是我的 tbl_syncList 的来源吗?还是有两个以上的表?
    • 很抱歉我试过了,但我不确定即使在阅读文档后我也能理解所有内容
    • 您不能在 ON DUPLICATE KEY UPDATE 子句中使用 WHERE 子句这一事实只是那些令人讨厌的情况之一,很容易看出一点额外的功能如何让您的生活变得更美好更容易,但是那一点功能还没有开发出来。我的示例中的“a”是“tbl_syncList”的别名,“b”是“stagingtable”的别名。见techonthenet.com/mysql/alias.php
    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多