2015-06-07 75 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

相關問題