我的数据库中有曲目和专辑。每首曲目都可以与专辑相关。用户可以更新与专辑相关的曲目。
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在使用时带来的麻烦/肮脏。
答案 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));