2012-04-10 57 views
0

我有一張圖片的表格,其中包含相應的listing_id和位置。SQL Update Where Statement

IMAGE_NAME,listing_id,位置

  • 可以有每listing_id多個圖像。
  • 每個圖像具有表示顯示順序

如果listing_id不具有在位置1的圖像時,我想利用該listing_id最低位置,並將其設置到位置1的整數位置。

喜歡的東西:

update media_table set position = 1 where ... 
+0

「1」是可能的最低位置還是可能有一個「0」? – 2012-04-10 17:50:18

回答

3

隨着語法修正通過@ypercube,查詢ñ工作流爲MySQL:

UPDATE media_table m 
JOIN (
    SELECT listing_id, min(position) AS position 
    FROM media_table 
    GROUP BY listing_id 
    HAVING min(position) > 1 
    ) x ON (m.listing_id, m.position) = (x.listing_id, x.position) 
SET m.position = 1; 

說明:

在子查詢中找到所有linsting_id其中最小position大於1,使用這些結果來更新行的時候了。我認爲(listing_id, position)是獨一無二的。

See working demo for MySQL.

+1

邏輯是100%的聲音,但我不確定這是否有效(在MySQL的「UPDATE」語法中)。 – 2012-04-10 17:59:55

+0

@ypercube:對,該語法不適用於MySQL。錯過了標籤。我提供了一個可以工作的替代解決方案。 – 2012-04-10 18:18:18

+0

@ypercube:我必須誤讀手冊,因爲您的替代語法清楚地起作用。從子查詢中選擇,然後*然後*更新涉及的表是沒有問題的,然後... – 2012-04-10 18:40:31

0
UPDATE media_table 
SET position=(SELECT MIN(position) FROM media_table) 
WHERE listing_id IS NULL; 
+0

你想要這樣的東西嗎? – Teja 2012-04-10 17:51:18

+0

不完全是,但謝謝!歐文釘了它。 – Bryan 2012-04-12 18:13:16

0

試試這個:

update images i1, 
(select i1.image_name, i1.listing_id from images i1 
    left join images i2 
    on i1.listing_id = i2.listing_id and i1.position > i2.position 
    where i2.position is null and i1.position != 1 
) f 
set position = 1 
where i1.image_name = f.image_name and i1.listing_id = f.listing_id; 

這是假設你可以通過image_name, listing_id識別的記錄。如果您可以通過image_name這樣做,那麼查詢會更簡單,因爲您可以刪除listing_id比較和選擇。