2012-04-10 129 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比较和选择。