将1个任意行分配为每个组的主要行

时间:2011-04-23 08:02:40

标签: mysql sql sql-update

我有一个包含三列的表,

foo_id | bar_id | is_primary 

现在导入了大量的记录后,id对都在,但is_primary到处都是0,我需要为每个foo_id分配1个任意行,is_primary = 1?

foo_id | bar_id是主要唯一键,但foo_id和bar_id都可以多次出现

2 个答案:

答案 0 :(得分:1)

假设所有(foo_id, bar_id)对都是唯一的,is_primary被限制为0或1(即没有其他值或NULL),您可以确定,例如,最小bar_id每个foo_id值的值,并为相应的行设置is_primary为1:

UPDATE atable t
  INNER JOIN (
    SELECT
      foo_id,
      MIN(bar_id) AS bar_id
    FROM atable
    GROUP BY foo_id
    HAVING MAX(is_primary) = 0
  ) s ON t.foo_id = s.foo_id AND t.bar_id = s.bar_id
SET t.is_primary = 1

答案 1 :(得分:0)

假设(foo_id,bar_id)是唯一的,您可以使用not exists子句过滤每bar_id foo_id的最高值:

update  YourTable yt1
set     is_primary = 1
where   not exists
        (
        select  *
        from    YourTable yt2
        where   yt2.foo_id = yt1.foo_id
                and yt2.bar_id > yt1.bar_id
        )