首頁 > 軟體

mysql中update按照多重條件進行更新處理的方案

2022-09-12 18:02:13

1.場景問題說明

mysql中一般的update寫法支援的方式是,update 表 set 欄位名=修改後的欄位值 where 條件1 and 條件2 and 其他條件;如果現在需求是對滿足where後面的條件基礎之上需對滿足指定的條件資料再進行不同更新處理,那應該如何處理?如果有這樣的疑問或是遇到此類場景請繼續往下看.

還原一下我遇到的業務場景:現有一批會員卡,會員卡型別有次數卡和期限卡之分,期限卡餘額為每天扣除一天,次數卡餘額不隨時間進行變化,只有使用之後才會扣除。現需要對會員卡進行更新截止時間的操作,其中只需要對期限卡更新餘額操作。主要問題的難點在於會員卡型別為期限卡的會員卡,不僅需要更新有效截止時間,還需要更新會員卡的餘額。為方便說明問題,簡化業務如下:將會員卡id為1、2、3的截止日期更新為2022-05-01 22:50:59,其中期限卡餘額更新為11.次數卡餘額不做處理(會員卡id為1和2為期限卡,3為次數卡)。

會員卡表資訊:

2.處理方案

2.1 使用update case when

sql如下:

UPDATE staff_card SET end_time="2022-05-01 22:50:59",update_time=NOW(),
rest_count=(CASE WHEN card_type=1 THEN 11 ELSE rest_count END) WHERE id IN  (1,2,3)

組態檔寫法:

 <update id="updateRestCount" >
           UPDATE staff_card
            <set>
            end_time="2022-05-01 22:50:59",update_time=NOW(),
rest_count=(CASE WHEN card_type=1 THEN 11 ELSE rest_count END)
           </set> 
            WHERE id IN  
            ( 
				<foreach collection="cardIds" item="cardId">
					#{cardId}
				</foreach>
			)  
    </update>

注意寫法:只對於期限卡才更新餘額,次數卡餘額不更新,也就是次數卡的餘額rest_count欄位不進行更新,直接寫ELSE rest_count,如果次數卡餘額更新為其他金額,則ELSE 後面寫具體的餘額值.

2.2 使用if標籤

組裝會員卡列表資訊,將每個會員卡的卡型別進行設定

  ArrayList<CardInfo> cardList= new ArrayList<>();
        CardInfo cardInfo = new CardInfo();
        // 設定會員卡id
        cardInfo.setId(1);
        // 設定會員卡型別:1.期限卡;2.次數卡
        cardInfo.setCardType(1);
        CardInfo cardInfo2 = new CardInfo();
        cardInfo2.setId(2);
        cardInfo2.setCardType(1);
        CardInfo cardInfo3 = new CardInfo();
        cardInfo3.setId(3);
        cardInfo3.setCardType(2);
        cardList.add(cardInfo);
        cardList.add(cardInfo2);
        cardList.add(cardInfo3);

mapper介面:

public interface CardMapper {
    // 更新會員卡資訊
    void updateRestCount(@Param("cardList") List<CardInfo> cardInfos);
}

組態檔:

 <update id="updateRestCount" >
        <foreach collection="cardList" item="card">
            UPDATE staff_card
            <set>
               end_time="2022-05-01 22:50:59",update_time=NOW(),
                <if test="card.cardType == 1">
                    rest_count =11
                </if>
            </set>
            WHERE id=#{card.id};
        </foreach>
    </update>

總結

到此這篇關於mysql中update按照多重條件進行更新處理的文章就介紹到這了,更多相關mysql update按多重條件更新內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com