WHERE id =(SELECT parent_id FROM sametable LIMIT 1)

时间:2015-06-07 11:06:45

标签: 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 ......

谢谢!

1 个答案:

答案 0 :(得分:4)

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

所以你只需将给定图库的图像重置为所需的状态。

如果IF(image_id = :image_id, 1, 0)与给定的1image_id匹配,则:image_id表达式会返回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查询访问同一个表。