2011-09-14 4 views
2

私はユーザーが最後に見た20の製品を保存したいと思います。ユーザーが製品番号21を参照すると、最も古いレコードがORACLEデータベースから削除されます。oracleデータベースのIDごとの行数を制限するにはどうすればよいですか。

テーブルには、システム内のすべてのユーザーの最近表示された製品が含まれています。

基本的に私は、ユーザーXがYレコードをテーブルに持っているかどうかをチェックする必要があります。もしそうなら、最も古いレコードを削除して、ユーザーXが最近見た製品テーブルにYレコードしかないようにします。

ご協力いただければ幸いです。

これは正しく動作しない試行です。

DELETE FROM VIEWED_PRODUCT 
WHERE id NOT IN (
    SELECT id 
    FROM (
    SELECT * FROM (
     SELECT id 
     FROM VIEWED_PRODUCT 
     WHERE MY_ID = 1626 
     ORDER BY CREATED_AT DESC) 
     WHERE ROWNUM <= 20 
) z 
); 

ありがとうございます。

+1

これは、データベース内で動的に行うためにひどいアイデアのように思えます。ユーザーが 'X'ページをブラウズしたり、他のトリガーアクションをクローズ/セーブ/実行すると、アプリケーションにこれを保存してDBを更新することができない理由はありますか? – JNK

+0

+1あなたの質問ではなく、あなたのMEGA MANアバターのためです。 – JonH

+0

@JNK:多分Webアプリケーションですか?すなわち、ユーザがトリガ動作を実行することを保証することはできない。 –

答えて

3

あなたは次のように分析関数を使用することができます。

delete viewed_product where id in 
(select id from 
    (select id, row_number() over (order by created_at desc) rn 
    from viewed_product 
    where my_id = :bindvar 
) 
    where rn > 20 
) 
+0

ありがとう、これは素晴らしいです! –

関連する問題