php sql 更新嵌套 FROM (SELECT)

php sql UPDATE with nested FROM (SELECT)

经过几个小时的尝试,我需要你的建议。

我想合并 2 个表中的行。 在 table1 中创建新行后,我想在 table2 中找到一行并合并一些字段。

如果我把嵌套的 SELECT 放在 SET 函数中 (设置邮政编码=(SELECT等) 是有效的,但是如果我把它放在 FROM 函数中会给出语法错误的错误

我的代码:

$sql = "INSERT INTO instanties(institution, category, postcode) 
        VALUES('$emapData[0]', '$emapData[1]', '$emapData[2]')";

if ($conn->query($sql) === TRUE) {
    //get last added id
    $last = $conn->insert_id;

    //define WHERE function
    $where="postcode_id=$postcode_id AND (minnumber <= $number AND maxnumber >= $number)";

    //UPDATE last added row in table with info from other table
    $sql2 = "UPDATE instanties 
            SET postcode_id=pc.postcode_id  
            FROM 
            (
                   SELECT postcode_id 
                   FROM postcode 
                   WHERE $where LIMIT 1
            ) pc 
            WHERE id=$last";

            $result = $conn->query($sql2);
            if ($result) {
                echo 'update is done<br/><br/>';
            }
        }
        else {
            echo "Error: " . $sql2 . "<br>" . $conn->error.'<br/><br/>';
        }
    }
    else {
        echo "Error: " . $sql . "<br>" . $conn->error.'<br/><br/>';
    }

试试这个:

$sql2 = "UPDATE instanties 
        SET postcode_id=(
               SELECT postcode_id 
               FROM postcode 
               WHERE $where LIMIT 1) 
        WHERE id=$last";

这不是有效的 MySQL 语法。您不能将 "FROM" 子句添加到 UPDATE 语句。 http://dev.mysql.com/doc/refman/5.0/en/update.html

但是,您仍然可以通过这种方式完成您想要完成的事情:

$sql2 = "UPDATE instanties 
        SET postcode_id=
        (
               SELECT postcode_id 
               FROM postcode 
               WHERE $where LIMIT 1
        ) 
        WHERE id=$last";

只要嵌套的 SELECT 中只有 1 个结果(并且您的 LIMIT 1 有点这样做)。

编辑: 如果您需要邮政编码table的许多字段,您可以加入:

$sql2 = "UPDATE instanties as i
        JOIN (
            SELECT * 
            FROM postcode 
            WHERE $where LIMIT 1
        ) as pc
        SET i.postcode_id=pc.postcode_id
        WHERE i.id=$last";

我们通常会在连接中使用 "ON" 子句,但由于您只更新 1 行,而嵌套的 SELECT 也将只更新 return 1 行,所以它不是有必要。