如何控制MYSQL中每条记录的最大行数?

时间:2015-08-13 07:36:15

标签: php mysql sql performance

表结构是:

user
-----
id

video
------
id

user_views
----------
id
user_id
video_id
create_date

并且user_views可以重复,以防止数据变得非常庞大,我想限制user_views记录:

每个用户最多可记录20个user_views,如果超过,则会以先进先出的方式替换最旧的记录

问题是,如何构建插入查询?

现在我的方法是使用PHP

  1. 计算特定用户的行数。
  2. if> 20,更新最后一条记录(按create_date排序)
  3. 其他,插入新记录
  4. 它有效,但我想要一个更好的表现方式,即MYSQL中的一个插入查询。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是一个简单的解决方案:创建虚拟记录,以便始终每个用户有20个视图。

insert into user_views (user_id, video_id, create_date)
select id, null, '1920-01-01' from user u
where (select count(*) from user_views uv where uv.user_id = u.id) < 20
union all
select id, null, '1919-01-01' from user u
where (select count(*) from user_views uv where uv.user_id = u.id) < 19
union all
select id, null, '1918-01-01' from user u
where (select count(*) from user_views uv where uv.user_id = u.id) < 18
union all
select id, null, '1917-01-01' from user u
where (select count(*) from user_views uv where uv.user_id = u.id) < 17
union all
...

选择数据以显示数据时,请排除虚拟记录:

select *
from user_views
where user_id = 123
and video_id is not null; -- dummy entries have video_id null

“插入”新数据时,请使用UPDATE:

update user_views
set video_id = 456, create_date = current_date()
where id = 
(
  select id 
  from
  (
    select id 
    from user_views
    where user_id = 123
    order by create_date
    limit 1
  ) oldest
);

(MySQL中需要子查询中的子查询,因为访问正在更新的同一个表时存在限制。)

SQL小提琴:http://sqlfiddle.com/#!9/11f2c4/1