2015-06-07 77 views
0

它基本上是一个单选按钮行为,但对于数据库。WHERE id =(SELECT parent_id FROM sametable LIMIT 1)

我有表galleries和表images

imagesimage_idgallery_idfeatured

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

应该有每个库只有一个特色图片。我的功能应采取image_id新功能的图像 - 设置featured真老featured假...

我如何该库的旧特色图片设置为false,新的一个真正的只对特定的画廊。 (我只是想提供图像不是gallery_id的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我认为...

谢谢!

+0

将它们全部设置为false。然后将真实的一个设置为true。做它作为交易。 – Strawberry

+0

在你的数据库上使用触发器... – Vogel612

回答

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

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

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

一位,超过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) 

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

+0

这很好,但:“我只想提供图像的id,而不是gallery_id” – Miro

+0

这就是我由于某种原因无法工作的原因... – Miro

+0

@ Vogel612 a子选择需要一些技巧 – zerkms

相关问题