使用select子查询和其他变量插入值

时间:2011-07-07 15:08:17

标签: sql pdo subquery prepared-statement

我有一个查询更新给定记录的布尔值,然后使用select子查询将该记录插入另一个表(取决于执行的操作)。 select子查询工作正常,但是如何在要插入的查询末尾添加其他变量?我之所以需要这样做是因为select子查询不包含这些数据,而且这些数据只会存储在原始记录被“复制”到的两个表中的一个中。

$id = $_POST['id'];
$action = $_POST['action'];
$reason = $_POST['reason'];
if($action == "approve") {
    $statement = $db->prepare("UPDATE waiting SET wait = :status WHERE id = :id");
    $statement->bindValue(':status', 0);
    $statement->bindParam(':id', $id);
    $statement->execute();

    $statement = $db->prepare("INSERT INTO approved (fname, lname, student_id, email, type) SELECT fname, lname, student_id, email, type FROM waiting WHERE id = :id");
    $statement->bindParam(':id', $id);
    $statement->execute();
    $lastId = $db->lastInsertId();

    $statement = $db->prepare("UPDATE approved SET reason = :reason WHERE id = $lastId");
    $statement->bindParam(':reason', $reason);
    $statement->execute();
}

基本上我想将使用select子查询的insert查询和将原因更新的更新查询组合成一个查询。这在语法上是否可行?

编辑:我应该更清楚,并说明传递的原因是用户输入文本字段的字符串。它不是表格中的列或任何其他数据。

由于

3 个答案:

答案 0 :(得分:3)

您始终可以选择常量,reason值只是SQL视点中的值,因此您可以将插入内容写为:

INSERT INTO approved (fname, lname, student_id, email, type, reason) 
SELECT fname, lname, student_id, email, type, :reason 
FROM waiting WHERE id = :id

然后绑定params然后运行查询,就是这样。

答案 1 :(得分:3)

Bbasically你可以通过简单地对查询中的值进行硬编码来为你的选择添加一个任意值。为了使其更加便于阅读,您可以使用'YOUR VALUE' as reason

将其替换为columnanme
INSERT INTO approved (fname, lname, student_id, email, type, reason) 
SELECT fname, lname, student_id, email, type, '$reason' as reason
FROM waiting WHERE id = :id

但是,您无法参数化表名或列名,因此您需要手动引用并将值转义为查询。

答案 2 :(得分:0)

如果“原因”数量有限,您可以使用单独的reasons表格并加入SELECT

INSERT INTO approved (fname, lname, student_id, email, type, reason) 
  SELECT w.fname, w.lname, w.student_id, w.email, w.type, r.reason
    FROM waiting w, reasons r 
    WHERE w.id = :id and r.id = :reasonsid