Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php WHEN子句中包含多个条件的MySQL案例_Php_Mysql - Fatal编程技术网

Php WHEN子句中包含多个条件的MySQL案例

Php 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

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

PHP接收一个曲目ID数组和一个唱片集ID。我正在尝试创建一个查询,该查询将更新曲目的唱片集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\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。这就是
之间的区别。我修正了逻辑。