表结构是:
user
-----
id
video
------
id
user_views
----------
id
user_id
video_id
create_date
并且user_views可以重复,以防止数据变得非常庞大,我想限制user_views记录:
每个用户最多可记录20个user_views,如果超过,则会以先进先出的方式替换最旧的记录
问题是,如何构建插入查询?
现在我的方法是使用PHP
它有效,但我想要一个更好的表现方式,即MYSQL中的一个插入查询。
感谢您的帮助。
答案 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中需要子查询中的子查询,因为访问正在更新的同一个表时存在限制。)