2015-06-13 61 views
1

這看起來像是一個重複問題,但似乎總是涉及多個表的問題。當選中表格中的一行時,我還需要在同一行中+1查看計數。我知道我不能在同一個查詢中使用觸發器或兩個語句,但是這兩件事情都可以通過與數據庫的單一連接完成嗎?首選方法是選擇一行然後+1視圖字段?在mysql中的一個連接中選擇並更新同一個表和行

+0

'update table set val = val + 1' - 如果你也想要這行,你必須做兩個查詢。 – twentylemon

+2

存儲過程。 'select'語句不會修改數據庫。 –

+0

我認爲他在這裏試圖做的是消除必須讀兩次表,一次讀更新,另一次讀。請看下面的答案,因爲它應該是一種使用2個查詢進行更新和閱讀的方式,但您只能在表格上操作一次。 –

回答

1

它可以在同一個連接中完成,但我想不出使用一個查詢完成該操作的方法。

下面是你將如何做一個單一的交易;

START TRANSACTION; 
UPDATE tbl SET view=view+1 WHERE id = 10; 

SELECT * FROM tbl WHERE id = 10; 
COMMIT; 

第二個「更好」的方法,你可以做到這一點,消除不必讀取tbl表的兩倍。

UPDATE tbl 
SET view = (@viewsCount := view + 1) 
WHERE id = 10; 

而得到的意見的新值算我會做這樣的事情

SELECT @viewsCount; 

第三種方式是通過利用LAST_INSERT_ID()功能,像這樣

UPDATE tbl 
SET view = LAST_INSERT_ID(view) + 1 
WHERE id = 10; 

然後要獲得新的視圖計數,您需要在更新後立即執行此查詢。更新後您不能執行任何其他查詢,否則您將無法獲得預期的價值。

SELECT LAST_INSERT_ID(); 
+0

謝謝邁克。我認爲第一個選擇是我想要的。第二個選項只有一個表讀取是我想要完成的,但我需要對查看計數進行選擇和更新。如果它很重要,我不需要使用select來獲取更新的視圖計數。我只是想找到最有效的方式來跟蹤選定行的查看次數,以便在日常的crone作業中使用。 –

+0

你將不得不將你需要做的事分成多個步驟。儘可能使用選項#1。您也可以在視圖列上選擇後添加一個觸發器,這會自動爲您增加值。我不建議使用觸發器,它會導致速度放慢 –

相關問題