0

「user_id」(varchar) と「date」(タイムスタンプ) 列を持つ mysql テーブル (「c5_imgs」) があります。この特定のテーブルのデータ量は、最初に予想していたよりもはるかに多くなったため、最近の 5 件を除く各 user_id のすべてのレコードを削除しようとしています。

特定の user_id に対して、削除したい行を取得できます。

select *
FROM c5_imgs i
where 
    date < (
        select date 
        from c5_imgs i2 
        where i.user_id = i2.user_id 
        order by i2.date desc
        limit 4,1
    )
and user_id = 'xxx'

しかし、これらの行を削除するのに問題があります:

delete
FROM c5_imgs
where 
    date < (
        select date 
        from c5_imgs i2 
        where 'xxx' = i2.user_id 
        order by i2.date desc
        limit 4,1
    )
and user_id = 'xxx'

#1093 - You can't specify target table 'c5_imgs' for update in FROM clause

そして、一度に1つだけではなく、すべてのuser_idに対して一般的なクエリを作成したい...助けていただければ幸いです。

編集:chetanの答えは、user_idの1つを削除するのに役立ちましたが、すべてのuser_idのより一般的な解決策を探しています。

Edit2 :私が最終的に使用したクエリは、クリスチャンの回答に基づいていました:

delete aa.* 
from c5_imgs aa,
(
select distinct c.user_id as user_id,
    (select x.date 
    from c5_imgs as x
    where x.user_id = c.user_id
    order by x.date desc
    limit 4,1) as date
from c5_imgs as c
) bb
where aa.user_id = bb.user_id and aa.date < bb.date
4

2 に答える 2

1

次の 3 つの手順で実行できます。

初め

create table aux
select distinct c.user_id as user_id,
    (select x.date 
    from c5_imgs as x
    where x.user_id = c.user_id
    order by x.date desc
    limit 4,1) as date
from c5_imgs as c;

2番

delete c5_imgs
from c5_imgs as c
inner join aux as a on a.user_id = c.user_id
where  c.date < a.date;

三番

drop table aux;

大きなテーブルを操作する場合は、補助テーブルの列にインデックスを作成して、削除アクションを高速化できます。

CREATE INDEX aux_idx1 ON aux(user_id);
CREATE INDEX aux_idx2 ON aux(date);

個別のユーザー ID を取得できる users テーブルがある場合は、最初のステップを簡素化し、速度を向上させることができることに注意してください。

これは、最新の画像を正確に 5 つ保持することを保証するものではありません。5 番目以降の位置にある複数の画像で日付がまったく同じである場合、これは必要に応じて機能しません。

于 2013-06-11T02:09:02.537 に答える
1

join を使用してそれを行うことができます。例えば

delete a.*
FROM c5_imgs a, (
        select date 
        from c5_imgs
        where 'xxx' = user_id 
        order by date desc
        limit 4,1
    ) b
where 
    a.date < b.date
and a.user_id = 'xxx';

このクエリは実行していませんが、動作するはずです。必要に応じて回避してください。

于 2013-06-11T02:03:56.583 に答える