2014-07-05 161 views
7

我有一個用PHP編寫的腳本,它有這條線正在正確選擇我需要的數據;MySQL - 選擇然後更新

$result = mysql_query("SELECT product_name, sku, qty FROM supplier_dropship_items WHERE supplier_id = '3' AND status = '2'", $db_beb); 

我正在掙扎是更新我選擇了記錄的方式,一旦選擇我需要改變status = '1'讓我的腳本運行它不會拉在相同的數據,下一次選擇並只會提取表中狀態爲2的新項目。

這是我的工作成果,這要歸功於下面接受的答案的評論;

$result = mysql_query("SELECT id, product_name, sku, qty FROM supplier_dropship_items WHERE supplier_id = '3' AND status = '2' FOR UPDATE", $db_beb); 

while($row = mysql_fetch_assoc($result)) 
{ 
    $sql_table_data[] = $row; 
    mysql_query("UPDATE supplier_dropship_items SET status=1 WHERE id='".$row['id']."'", $db_beb); 
} 
+2

選擇查詢後運行更新查詢 –

+0

好吧,對不起,我正在學習MySQL。如果我在選擇之後做了單獨的更新,我可以在技術上更改可能在選擇之後添加的產品,以便在下次腳本運行時不能選擇這些產品。如果這是有道理的。 – TheWebsiteGuy

+0

如果僅更新您首先選擇的SKU,則不適用。 (或暗示你的主鍵是其他任何東西) – ESG

回答

4

如果supplier_dropship_items有一個主鍵(它應該),然後將這些字段包含在SELECT,那麼,當你循環通過的結果,使用主鍵設置status,如在執行UPDATE

UPDATE supplier_dropship_items SET status=1 WHERE <id_field>=<id_value>; 

這是假定將未在併發環境中執行。如果你是,那麼你應該鎖定更新記錄,通過使用SELECT... FOR UPDATE。你可以閱讀關於它here。據我所知,這在InnoDB表的MySQL下工作。

+0

你也可以鎖定這些表,這樣這個命令不會導致死鎖(在InnoDB中)''LOCK TABLES supplier_dropship_items WRITE' –

+0

Thanks @Marion C'Ascanio,這個作品完美,更重要的是我明白了:)我會將結果添加到問題中作爲參考。 – TheWebsiteGuy

+0

很棒,@ Innov8!很高興能幫到你! –

10

只是在您同時選擇更新時進行更新。

改變了...

SELECT product_name, sku, qty 
FROM supplier_dropship_items 
WHERE supplier_id = '3' AND status = '2' 

這樣:

UPDATE supplier_dropship_items as t, 
(
    SELECT id, product_name, sku, qty 
    FROM supplier_dropship_items 
    WHERE supplier_id = '3' AND status = '2' 
) as temp 
SET status = '1' WHERE temp.ID = t.ID 

這是假設你有你的表裏面的ID列,這是它應該如何設置,如何任何標準化表看起來像

+0

Hi @ John Ruddell,我剛剛測試過這個,雖然它更新了項目的選擇,但是他們沒有傳遞給'$ result'給我,然後在我的php腳本中使用? – TheWebsiteGuy

+0

ok然後在運行更新之前運行查詢。基本上只是運行你的查詢,所以你有它的結果,然後更新表,如果這是有道理的。 –

+0

此語法導致我的MySQL服務器發生錯誤: 1.表達式是預期的。 (靠近「(」在位置39) 2.意外標記(靠近「(」在位置39) 3.找到一條新語句,但它與前一條之間沒有分隔符。 46) –