簡體   English   中英

在WHEN子句中具有多個條件的MySQL CASE

[英]MySQL CASE with multiple conditions in WHEN clause

我的數據庫中有曲目和專輯。 每個曲目都可以屬於一個專輯。 用戶可以更新與專輯有關的曲目。

PHP接收一個曲目ID數組和一個專輯ID。 我正在嘗試創建1個查詢,該查詢將更新曲目的專輯ID,如果不再與專輯相關,則同時將曲目的專輯ID設為NULL。

$query = "UPDATE tracks
          SET album_id =
            CASE
              WHEN album_id = :album_id AND NOT FIND_IN_SET(tempkey, :tracks) THEN NULL
              WHEN FIND_IN_SET(tempkey, :tracks) THEN :album_id
            END
          WHERE account_id = :account_id";

$statement = $pdo_conn->prepare($query);
$statement->execute($data);

album_id = :album_id部分似乎album_id = :album_id 每次更新任何給定曲目的專輯ID時,它都會使所有其他曲目的專輯ID為NULL。

我該如何解決該查詢以實現所需的功能(如果與僅使用2個查詢相比還是值得的話)?

FIND_IN_SET :使用FIND_IN_SET就像NOT IN / IN但是沒有使用時PDO造成的麻煩/骯臟。

您需要ELSE條件。 否則默認為ELSE NULL

CASE
  WHEN album_id = :album_id AND NOT FIND_IN_SET(tempkey, :tracks) THEN NULL
  WHEN FIND_IN_SET(tempkey, :tracks) THEN :album_id
  ELSE album_id
END

另一種方法是在WHERE進行一些過濾。 您的查詢嘗試更新account_id所有行。 那可能不是好事。

這是將一些過濾移到WHERE一種方法:

UPDATE tracks
    SET album_id = (CASE WHEN FIND_IN_SET(tempkey, :tracks) > 0 THEN :album_id END)
    WHERE account_id = :account_id AND
          (album_id = :album_id OR FIND_IN_SET(tempkey, :tracks));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM