5

私のDBはこの構造を持っています:

ID | text | time | valid

これが私の現在のコードです。これを1つのクエリとして実行する方法を見つけようとしています。

rows = select * from table where ID=x order by time desc;
n=0;
foreach rows{
    if(n > 3){
       update table set valid = -1 where rows[n]; 
    }
    n++
}

特定の ID に存在する行数を確認しています。次に、n > 3 のすべての行に対して valid=-1 を設定する必要があります。

1つのクエリでこれを行う方法はありますか?

4

4 に答える 4

5

WHERE次のように、句でサブクエリを使用できます。

UPDATE table
   SET valid=-1
 WHERE (
         SELECT COUNT(*)
           FROM table tt
          WHERE tt.time > table.time
            AND   tt.ID = table.ID
) > 3

サブクエリは、同じ ID で時間の経過した行をカウントします。このカウントは、最新の 3 行では 3 以下になります。残りのものはカウントが大きいため、それらのvalidフィールドが更新されます。

于 2013-10-10T13:30:28.910 に答える
2
update table 
   set valid = -1
 where id in (select id
                from table 
               where id = GIVEN_ID
            group by id
              having count(1) >3)

更新: dasblinkenlight のソリューションは非常に優れているため、非常に気に入っていますが、非常に冗長な方法でそれを実行したいとも考えていました。

  update Table1
     set valid = -1
   where (id, time) in (select id, 
                               time
                          from (select id,time
                                  from table1
                                 where id in (select id
                                                from table1
                                            group by id
                                              having count(1) >3)
                                -- and id = GIVEN_ID
                              order by time 
                                 limit 3, 10000000) 
                        t);

SQLFiddleでも

于 2013-10-10T13:29:26.763 に答える
2

制約(id,time)があると仮定すると、つまり、2 つの行が同じで同じになることはありません。UNIQUEidtime

UPDATE 
    tableX AS tu
  JOIN
    ( SELECT time
      FROM tableX
      WHERE id = @X                      -- the given ID
      ORDER BY time DESC
      LIMIT 1 OFFSET 2
    ) AS t3
    ON  tu.id = @X                       -- given ID again
    AND tu.time < t3.time 
SET
    tu.valid = -1 ;
于 2013-10-10T14:17:13.137 に答える