您好,登錄后才能下訂單哦!
小編給大家分享一下MySQL中怎樣更新排序值以及存儲過程更新排序值,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
公司有表Task 和 Question,
Question表大致如下
id,bigint(20) student_id,bigint(20) task_id,bigint(20) name,varchar(100) ranking,int(11) not null default 999 comment '排序 根據ranking和id一起排序'
如上所示, 當查詢時只需sql加個排序就行, order by ranking, id, 這樣新增時不用先獲取最大ranking值(或count);
現在新增需求, 此時ranking最好在增刪改時, 重新排序好(從1開始到結束), 需要將已有數據排序好:
# 先定義一個變量ranking, 在update時自增 set @ranking = 0; update task_question set ranking = (@ranking := @ranking+1) where task_id = #{Task表主鍵} order by ranking, id;
但是以上sql只能更新某一個Task的數據, 我這里需要更新所有的Task, 所以寫了一個存儲過程:
# delimiter $$ ???? drop procedure if exists test; # 如果存在名字為test的procedure則刪除 create procedure test() # 創建(創建函數使用的關鍵字為function 函數名()) begin declare taskId bigint; declare flag int default 0; # 這是重點,定義一個游標來記錄sql查詢的結果(此處的知識點還有SQL的模糊查詢,見補充) declare taskList cursor for select id from task; # 為下面while循環建立一個退出標志,當游標遍歷完后將flag的值設置為1 declare continue handler for not found set flag=1; open taskList; # 打開游標 # 將游標中的值賦給定義好的變量,實現for循環的要點 fetch taskList into taskId; while flag <> 1 do # 在這里設置一個局部變量 ranking set @ranking = 0; update task_question set ranking = (@ranking := @ranking+1) where task_id = taskId order by ranking, id; # 游標后移 fetch taskList into taskId; end while; close taskList; # 關閉游標 end; # $$ # 執行存儲過程 call test();
以上是“MySQL中怎樣更新排序值以及存儲過程更新排序值”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。