2013-01-24 31 views
4

我需要做一些事情,這似乎是很簡單的:SQL更新,其中XX和最新記錄

$bdd->query('UPDATE mytable SET aaa = \''.$aaa.'\', bbb = \''.$bbb.'\' WHERE name = \''.$name.'\''); 

我的問題:我有符合這一點,多個記錄「WHERE」,我只想更新最近的一次(我有一個日期,可以用來定義記錄是最近的一個ID)我怎樣才能改變我在哪裏添加類似

和id = the_highest_id_of_this_query」?

+0

與你的問題無關,下面回答了這個問題,但我可能會建議在你的查詢周圍使用雙引號,這樣你就不必逃避所有的單引號。您可以使查詢更易於閱讀,並且可以減少出錯,從而以這種方式編寫。 –

+0

請注意,您可能對SQL注入開放。即使查詢不使用任何外部數據,也只是爲了保持一致,並遵循良好的做法,最好使用參數化查詢。 –

回答

14

您可以limitupdate只有最近的記錄

UPDATE your_table 
SET some_column = 1 
order by date_time_column desc 
limit 1 

其中date_time_column可以顯示的記錄的順序任意列。它也可以是一個自動增量ID。

+0

太棒了,我試試這個解決方案 – jrm

+0

如果有多個用戶訪問這個數據庫呢? – Pureferret

+0

這不適合我。只有讓我更新,如果順序被刪除,似乎弄亂了它 – Sam

2
UPDATE table 
SET column = value 
WHERE primary_key = 
(
SELECT primary_key 
FROM table 
WHERE date_time_column = (select max(date_time_column) FROM table WHERE other_conditions) 
) 
AND other_conditions 

此查詢不使用order by或limit子句,因此將是可移植的。請注意,other_conditions在內部查詢和外部查詢中必須相同。

(因爲這是張貼在評論中)爲什麼內部查詢需要與外部條件具有相同的條件?

  • 如果內部條件獲取比外一個更廣闊的結果集,你可以用date_time_column比那些包含在滿足條件外排更早結束。那麼它們將導致0行的提取。

  • 如果內部條件獲取比外部條件更窄的結果集,那麼最終可能會丟失任何更新的記錄,而不是內部集合的一部分,但作爲外部條件的一部分尚未滿足。

希望澄清。

+0

...'other_conditions'可能不_必須在內部是相同的和外部查詢,如果他的主鍵是唯一的(通常是這種情況)。另外,如果正在使用最大日期/時間來查找用於查找要更新的記錄的主鍵(即,只有一行具有特定的時間戳),則可以使用主鍵快捷鍵,然後使用日期/時間列。 –

+0

other_conditions *在兩個查詢中都必須相同。解釋很長,所以編輯我的答案以解釋 – alok

+0

我讀了alok的其他條件需要在內部和外部查詢中多次的原因,我仍然不明白爲什麼它是必要的。內部查詢應該返回一個單一的ID,它應該是一個唯一的密鑰。外部查詢需要知道的唯一事情是識別需要更新的單行的唯一鍵。外部查詢不需要other_conditions。除非我錯過了一些東西... – Josh