2012-07-13 66 views
9

我想這兩個查詢在扭曲蟒蛇結合:MySQL的:返回更新的行

SELECT * FROM table WHERE group_id = 1013 and time > 100; 

和:

UPDATE table SET time = 0 WHERE group_id = 1013 and time > 100 

到一個查詢。是否有可能這樣做?

我試圖把SELECT放在子查詢中,但我不認爲整個查詢返回我想要的。

有沒有辦法做到這一點? (甚至更好,沒有子查詢) 或者我只需要堅持兩個查詢?

謝謝你,

+2

這些概念兩種不同的行爲。你想通過某種方式將它們結合起來獲得什麼? – Wiseguy 2012-07-13 19:36:24

+0

我想盡可能快地使我的查詢,因爲它將處理重負荷。 – 2012-07-13 19:39:25

+1

那麼,你不能合併這些查詢。要優化速度,請務必正確編制索引表。 ['EXPLAIN'](http://dev.mysql.com/doc/refman/5.5/en/using-explain.html)將幫助您通知需要優化的事情。 – Wiseguy 2012-07-13 19:51:02

回答

3

您不能直接組合這些查詢。但是你可以寫一個執行兩個查詢的存儲過程。例如:

delimiter | 
create procedure upd_select(IN group INT, IN time INT) 
begin 
    UPDATE table SET time = 0 WHERE group_id = @group and time > @time; 
    SELECT * FROM table WHERE group_id = @group and time > @time; 
end; 
| 
delimiter ; 
+3

更新後,Squall Leohart想要返回的行有time = 0,所以SELECT條件時間> @time將無法按預期工作。 – md2perpe 2015-10-16 10:32:52

5

顯然的MySQL確實有一些可能是有用的,特別是如果你只更新一行。

這個例子是:http://lists.mysql.com/mysql/219882

UPDATE mytable SET 
mycolumn = @mycolumn := mycolumn + 1 
WHERE mykey = 'dante'; 

SELECT @mycolumn; 

我從來沒有試過這種,雖然,但不要讓我知道你上車。

+0

謝謝,但我想返回多行 – 2012-07-13 21:44:54

2

所以你想要做的是復位time爲零每當你訪問一個行 - 有點像一個觸發器,但SELECT後MySQL不能做觸發器。

也許最好的方式來執行應用程序的一個服務器請求是編寫一個更新,然後返回該行的存儲過程。如果兩者一起發生非常重要,請將兩個語句包裝在一個事務中。

1

有更新的行的回報更快的版本,並與高負載的系統打交道時更準確,同時要求提供查詢的執行同一個數據庫服務器上

update table_name WITH (UPDLOCK, READPAST) 
SET state = 1 
OUTPUT inserted. 
+1

我相信這隻適用於MS SQL。這篇文章是關於MySQL的。 – PromInc 2017-02-27 17:03:05