Php WHEN子句中包含多个条件的MySQL案例
我的数据库中有曲目和相册。每首曲目都可以属于一张专辑。用户可以更新与相册相关的曲目 PHP接收一个曲目ID数组和一个唱片集ID。我正在尝试创建一个查询,该查询将更新曲目的唱片集ID,同时如果曲目的唱片集ID不再与唱片集相关,则将其设为NULLPhp WHEN子句中包含多个条件的MySQL案例,php,mysql,Php,Mysql,我的数据库中有曲目和相册。每首曲目都可以属于一张专辑。用户可以更新与相册相关的曲目 PHP接收一个曲目ID数组和一个唱片集ID。我正在尝试创建一个查询,该查询将更新曲目的唱片集ID,同时如果曲目的唱片集ID不再与唱片集相关,则将其设为NULL $query = "UPDATE tracks SET album_id = CASE WHEN album_id = :album_id AND NOT FIND_IN_SET(te
$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\u id=:album\u id
似乎不起作用。每次我更新任何给定曲目的唱片集ID时,它都会使所有其他曲目的唱片集ID为空
如何修复此查询以实现我想要的(如果与仅使用两个查询相比仍然值得的话)
Ps:使用
FIND_IN_SET
,就像NOT IN/IN
一样,但没有PDO在使用时带来的麻烦/肮脏。您需要否则
条件。否则,默认情况下会得到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
中进行一些过滤。您的查询尝试更新帐户\u id
的所有行。这可能是好事,也可能不是好事
这里有一种方法可以将一些过滤移到中,其中
:
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));
看到
FIND_IN_SET
通常表明您创建了一个违反关系数据库设计原则的模式。这些在非平凡数据量上的性能往往非常差。使用FIND_IN_SET
可以避免PDO在使用IN
时带来的麻烦。在
中是否值得这么麻烦?如果您正在与PDO作斗争,您可能希望切换到使用成熟的ORM,这样您就不会自己编写这样的查询了,这些都是很好的例子。谢谢我替换了album\u id
的album
列以进行查询。它更新:tracks输入中给出的曲目,但它NULL
s所有其他曲目的专辑ID。@DanP。这就是和
与或
之间的区别。我修正了逻辑。