Вставка значений с помощью подзапроса select И дополнительной переменной - PullRequest
0 голосов
/ 07 июля 2011

У меня есть запрос, который обновляет логическое значение для данной записи, а затем вставляет эту запись в другую таблицу (в зависимости от выполненного действия), используя подзапрос 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();
}

В основном я хочу объединить запрос вставки, который использует подзапрос выбора, и запрос на обновление, который обновляет причину, в один запрос.Возможно ли это синтаксически?

РЕДАКТИРОВАТЬ: Я должен быть более ясным и утверждать, что причина передачи - строка, введенная пользователем в текстовое поле.Это не столбец или любые другие данные в таблице.

Спасибо

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

В принципе, вы можете добавить произвольное значение к вашему выбору, просто жестко закодировав значение в запросе.Чтобы сделать его более удобным для чтения, вы можете присвоить ему псевдоним columnanme с помощью 'YOUR VALUE' as reason

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

Однако вы не можете параметризовать имена таблиц или столбцов, поэтому вам нужно вручную заключать в кавычки и экранировать значение в запросе.

3 голосов
/ 07 июля 2011

Вы всегда можете выбрать константу, и значение 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

Просто свяжите параметры и запустите запроси все тут.

0 голосов
/ 07 июля 2011

Если количество причин ограничено, вы можете иметь отдельную таблицу 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
...