2011-07-07 36 views
0

我有一個查詢更新給定記錄的布爾值,然後插入該記錄到另一個表(取決於所執行的操作)使用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子查詢的插入查詢和更新原因到一個查詢的更新查詢。這在語法上可能嗎?

編輯:我應該更清楚,並說明傳遞的原因是由用戶輸入到文本字段的字符串。這不是表格中的列或任何其他數據。

感謝

回答

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然後和運行查詢,就是這樣。

+0

不會,基本上可以告訴查詢來選擇不管它是我綁定:原因?我的主要問題是,從中複製記錄的原始表格根本沒有「原因」字段(這也意味着它沒有相同數量的列) – Aaron

+0

從原始代碼中我猜原因是由用戶提供的('$ reason = $ _POST ['reason'];'),這就是應該插入數據庫的內容。澄清,如果我錯了。 – SWeko

+0

是的,這是正確的。對不起,我很快就跳起來,假設你發佈的內容不是我想要做的。你的查詢實際上工作完美。謝謝! – Aaron

3

基本上,您可以通過簡單地對查詢中的值進行硬編碼來爲您的選擇添加一個任意值。爲了使eaier閱讀你可以用'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 

然而別名到columnanme,你不能這樣,你需要手動報價參數表或列名,逃離值到查詢。

+0

這將添加一個列名稱,但該選擇對該列沒有任何內容。 – Vache

+0

@Vache:'$ reason'應該是他想插入的值而不是列名。例如,在sql客戶端中將'SELECT'值'as'用作sql,並查看返回結果:-) – prodigitalson

+0

的確,您的+1 – Vache

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 
+0

對不起,原因將是用戶輸入什麼(它基本上是一個文本字段)。好主意雖然:) – Aaron

相關問題