mysql - WHERE id = (SELECT parent_id FROM sametable LIMIT 1)

标签 mysql subquery where-clause

这基本上是一个单选按钮行为,但用于数据库。

我有表 galleries 和表 images

imagesimage_idgallery_idfeatured

1 | 55 | true
2 | 55 | false
3 | 55 | false
4 | 54 | true

每个画廊应该只有一张精选图片。我的函数应该采用 image_id 作为新特色图片 - 将 featured 设置为 true 并将旧的 featured 设置为 false...

如何仅针对该特定画廊将该画廊的旧特色图像设置为 false,并将新图像设置为 true。 (我只想提供图片的 ID 而不是 gallery_id。)

我正在考虑使用 2 个查询:一个用于取消设置当前的,一个用于设置新的

我什至无法让第一个工作。这是我尝试过的:

UPDATE `images` SET `featured` = 0 WHERE `featured` = 1 
AND `page_id` = (SELECT `page_id` FROM `images` WHERE `image_id` = :image_id LIMIT 1)

由于某些原因,这不起作用。不可能有另一个 where 我想...

谢谢!

最佳答案

UPDATE `images`
   SET `featured` = IF(image_id = :image_id, 1, 0)
 WHERE `gallery_id` = :gallery_id

因此您只需将给定图库的图像重置为所需状态即可。

如果 image_id 匹配给定的 :image_id,IF(image_id = :image_id, 1, 0) 表达式返回 1 0 否则。

比起 mysql 的 SQL 方言更喜欢 ANSII SQL 的人可能会使用

CASE image_id WHEN :image_id THEN 1 ELSE 0 END

相反。

如果您不想显式传递 gallery_id,您可以在同一查询中选择它:

WHERE `gallery_id` IN (SELECT gallery_id FROM
                (SELECT gallery_id FROM images WHERE image_id = :image_id) x)

注意有 2 嵌套查询。你需要它来愚弄 mysql,因为它不允许从 DML 查询访问同一个表。

关于mysql - WHERE id = (SELECT parent_id FROM sametable LIMIT 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30692797/

相关文章:

mysql - 如何在mySql中多次执行select语句?

php/mysql 获取数据库中的所有表和列

mysql - 如何编写可以跨多个表匹配 3 个参数之一的 select 语句

sql - 为每个用户选择最大记录

sql - PostgreSQL SQL 语法

mysql - 如何强制 mySQL 在 WHERE 比较中不将 varchar 转换为数字

sql - Where子句,返回至少满足三个条件中的两个条件的值

javascript - 从数据库中获取选择选项的列值

SQL Select Distinct 与条件

mysql - 通过具有 GROUP BY 的子查询获取行数 - MySQL