MySQL更新难题

时间:2011-07-14 18:29:29

标签: mysql sql sql-update greatest-n-per-group

我有一张名为Advert_images的表格。在此表中,每个advert_id可能有几条记录。 Advert_images表中的每个记录都有一个名为“image_id”的唯一字段。 e.g。

image_id   advert_id   main
---------------------------
1          1           0
2          1           0
3          1           0
4          2           0
5          2           0

我想做的是:

仅针对每个不同main的第一条记录(最低image_id),将名为advert_id的字段更新为1 。 IE:我想更新image_id为1和4的记录,并将主字段设置为1.

2 个答案:

答案 0 :(得分:2)

您不能在使用MySQL的单个查询中执行此操作。它不允许您在同时在表上进行子选择的同时更新表。但是,如果它确实如此,则查询将是

UPDATE Advert_images
SET (main = 1)
WHERE (image_id IN (
   SELECT min(image_id)
   FROM Advert_images
   GROUP BY advert_id
));

没有什么说你不能通过外部脚本分两步完成。运行内部查询以获取“最低”图像的ID,然后运行单独的更新查询以更改主字段值。

答案 1 :(得分:2)

使用派生表可以在UPDATE中多次引用一个表:

UPDATE Advert_images a
INNER JOIN (
 SELECT advert_id, MIN(image_id) as image_id FROM Advert_images 
 GROUP BY advert_id)b
ON b.image_id = a.image_id
SET a.main = 1