溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL中怎樣更新排序值以及存儲(chǔ)過(guò)程更新排序值

發(fā)布時(shí)間:2021-06-15 15:00:24 來(lái)源:億速云 閱讀:737 作者:小新 欄目:大數(shù)據(jù)

小編給大家分享一下MySQL中怎樣更新排序值以及存儲(chǔ)過(guò)程更新排序值,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

公司有表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 '排序 根據(jù)ranking和id一起排序'

如上所示, 當(dāng)查詢時(shí)只需sql加個(gè)排序就行, order by ranking, id,  這樣新增時(shí)不用先獲取最大ranking值(或count);

現(xiàn)在新增需求, 此時(shí)ranking最好在增刪改時(shí), 重新排序好(從1開(kāi)始到結(jié)束), 需要將已有數(shù)據(jù)排序好:

# 先定義一個(gè)變量ranking, 在update時(shí)自增
set @ranking = 0;
update task_question set ranking = (@ranking := @ranking+1) 
where task_id = #{Task表主鍵} order by ranking, id;

但是以上sql只能更新某一個(gè)Task的數(shù)據(jù), 我這里需要更新所有的Task, 所以寫了一個(gè)存儲(chǔ)過(guò)程:

# delimiter $$ ????
drop procedure if exists test;  # 如果存在名字為test的procedure則刪除
create procedure test()  # 創(chuàng)建(創(chuàng)建函數(shù)使用的關(guān)鍵字為function 函數(shù)名())
begin
    declare taskId bigint;
    declare flag int default 0;
    # 這是重點(diǎn),定義一個(gè)游標(biāo)來(lái)記錄sql查詢的結(jié)果(此處的知識(shí)點(diǎn)還有SQL的模糊查詢,見(jiàn)補(bǔ)充)
    declare taskList cursor for  select id from task;
    # 為下面while循環(huán)建立一個(gè)退出標(biāo)志,當(dāng)游標(biāo)遍歷完后將flag的值設(shè)置為1
    declare continue handler for not found set flag=1;
    open taskList;  # 打開(kāi)游標(biāo)
    # 將游標(biāo)中的值賦給定義好的變量,實(shí)現(xiàn)for循環(huán)的要點(diǎn)
    fetch taskList into taskId;
    while flag <> 1 do
    # 在這里設(shè)置一個(gè)局部變量 ranking
        set @ranking = 0;
        update task_question set ranking = (@ranking := @ranking+1) where task_id = taskId order by ranking, id;
        # 游標(biāo)后移
        fetch taskList into taskId;
    end while;
    close taskList;  # 關(guān)閉游標(biāo)
end;
# $$

# 執(zhí)行存儲(chǔ)過(guò)程
call test();

以上是“MySQL中怎樣更新排序值以及存儲(chǔ)過(guò)程更新排序值”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI