通过相同的id更新其他表中其他行的值的表行

时间:2012-09-10 03:04:25

标签: php mysql sql-update jointable

我想要contracts表中的值更新表contracts_history,其中id都与其他id相同。

我写这段代码但不行:

function recover_contract($contract_id)
{
$sql = "UPDATE contracts SET ROW = (SELECT * FROM contracts_history WHERE contracts.ID = contracts_history.ID)";
$result = $this->update($sql);
return $result;
}

更新
我用这个代码

update 
contracts a, 
contracts_history b 
set 
a.name_surname=b.name_surname 

但我的桌子有64个结构 是不是任何解决方案复制所有结构类型的数据? 必须这样:

$sql = "INSERT INTO `contracts_history` SELECT * FROM `contracts` 
        WHERE id='$contract_id'";

3 个答案:

答案 0 :(得分:2)

您可以尝试将其作为查询吗?

$sql = "UPDATE contracts c 
        LEFT JOIN contracts_history h ON c.ID = h.ID 
        SET WHAT_YOU_WANT";

答案 1 :(得分:2)

由于您要更新到一列,因此subquery只应返回一个值。

尝试,

UPDATE contracts 
SET ROW = (SELECT columnName
           FROM contracts_history 
           WHERE contracts.ID = contracts_history.ID
           LIMIT 1)

或使用JOIN

使用
UPDATE contracts a
       INNER JOIN contracts_history b
       ON a.ID = b.ID
SET    a.row = b.columnName

更新1

确定。所以,在第一种使用子查询中的值进行更新的类型中,我在select语句中添加了LIMIT,因为您无法更新一个包含多个值的列,否则您将收到错误消息。在连接两个表的第二部分上,a.ID = b.ID是两个表的关系。这定义了表格如何相互关联。 SET a.row = b.columnNamecolumnName是值的来源,基本上位于表contracts_history上。

答案 2 :(得分:2)

语法如下:

update 
    contracts a, 
    contracts_history b 
set 
    a.col1=b.col1, 
    a.col2=b.col2 
where 
    a.id=b.id 
但是,在该注释中,您没有在查询中指定ID,这意味着它将更新 ALL 历史记录表中的行。您可以添加以下条件:

update 
    contracts a, 
    contracts_history b 
set 
    a.col1=b.col1, 
    a.col2=b.col2 
where 
    a.id=b.id 
    and a.id=3