如何在一个MySQL查询中组合两个UPDATE语句?

Nig*_*ICU 3 mysql sql-update

问候,

如何在一个查询中执行两个UPDATE语句,例如:

UPDATE albums SET isFeatured = '0' WHERE isFeatured = '1'
Run Code Online (Sandbox Code Playgroud)

结合

UPDATE albums SET isFeatured = '1' WHERE id = '$id'
Run Code Online (Sandbox Code Playgroud)

基本上,当一个新专辑被推出时,之前推荐的专辑将切换回正常状态,并将新推出的专辑设置为活动状态.

谢谢!

Cha*_*ndu 7

试试这个:

UPDATE albums SET isFeatured = IF(id!='$id', '0','1')
Run Code Online (Sandbox Code Playgroud)


Ric*_*son 7

当你必须做这种事情时,它表明你的数据模型是错误的,可以做一些修复.

因此,我建议添加一个单独的表featured_albums(FK:int id_album)并使用它来确定相册是否有特色.

您的更新成为

DELETE FROM featured_album; INSERT INTO featured_album SET id_album = $id;
Run Code Online (Sandbox Code Playgroud)

选择加入表时

SELECT album.id,
       album.name, 
       ( id_album IS NOT NULL ) AS isfeatured
FROM   album
LEFT JOIN featured_album ON id_album = album.id 
Run Code Online (Sandbox Code Playgroud)

根据要求扩展以上基本上我建议添加一个表格,其中包含一行表示当前所选专辑.这是1对1的关系,即专辑表中的一个记录在feature_albums表中有一个相关记录.请参阅关系类型.

专辑架构图

从相册表中删除isFeatured字段并添加新表.

CREATE TABLE `featured_album` (
    `id_album` INTEGER NOT NULL,
    FOREIGN KEY (id_album) REFERENCES `album` (`id`)
);
Run Code Online (Sandbox Code Playgroud)

DELETE FROM.. INSERT INTO行通过创建表中的条目设置特色的专辑.

带有LEFT JOIN的SELECT语句将从专辑表中提取记录并从feature_album表中加入匹配的记录,在我们的例子中只有一个记录匹配,因为在feature_album表中有一个字段它将为所有人返回NULL特色专辑以外的唱片.

如果我们这样做了

SELECT album.id, album.name, featured_album.id_album as isFeatured0
FROM   album
LEFT JOIN featured_album ON id_album = album.id 
Run Code Online (Sandbox Code Playgroud)

我们会得到以下内容:

+----+----------------+------------+
| id | name           | isFeatured |
+----+----------------+------------+
|  1 | Rumours        |       NULL |
|  2 | Snowblind      |       NULL |
|  3 | Telegraph road |          3 |
+----+----------------+------------+
Run Code Online (Sandbox Code Playgroud)

即isFeatured为NULL或ID.

通过添加( id_album IS NOT NULL ) AS isfeatured和使用我们得到的第一个查询

+----+----------------+------------+
| id | name           | isfeatured |
+----+----------------+------------+
|  1 | Rumours        |          0 |
|  2 | Snowblind      |          0 |
|  3 | Telegraph road |          1 |
+----+----------------+------------+
Run Code Online (Sandbox Code Playgroud)

即isfeatured为0/1,这使得事物更具可读性,尽管如果你在PHP中处理结果,它对你的代码没有任何影响.


too*_*too 5

您可以使用CASE WHEN语句,并记住在必要时设置原始值(下面的 ELSE 子句)并根据需要排序 CASE 条件(在下面的语句中,如果请求 id 的行也有 isFeatured = 1,则 isFeatured 将为 0,要更改它,请交换 WHEN 子句)。

UPDATE albums 
SET isFeatured = CASE 
  WHEN isFeatured = '1' THEN '0' 
  WHEN id = '$id' THEN '1'
  ELSE isFeatured
END
Run Code Online (Sandbox Code Playgroud)