2011-09-14 48 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'页面或关闭/保存/执行其他触发器操作后更新数据库? – 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

谢谢,这个作品太棒了! –