具有WHEN子句中的多个条件的MySQL CASE

时间:2017-10-10 22:07:17

标签: php mysql

我的数据库中有曲目和专辑。每首曲目都可以与专辑相关。用户可以更新与专辑相关的曲目。

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似乎不起作用。每次我更新任何给定曲目的专辑ID时,它都会使所有其他曲目的专辑ID为NULL。

我如何修复此查询以实现我想要的(如果与仅使用2个查询相比它仍然值得)?

Ps:使用FIND_IN_SET NOT IN / IN,但没有PDO在使用时带来的麻烦/肮脏。

2 个答案:

答案 0 :(得分:1)

您需要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

答案 1 :(得分:0)

另一种方法是在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));