假设你有一个userstable:
用户(ID、用户名、密码)
假设你有一个pictures table:
图片(id、标题、src)
另外,假设你有一个ratings table:
评分(id、user_id、picture_id、值)
当图片展示给用户时,需要判断用户是否已经对该图片进行评分:
select 1
from ratings
where user_id = 5 and picture_id = 10
(假设5是登录用户的id,10是图片的id)
如果查询返回记录,则用户已经对图片进行了评分,他/她应该不再能够对其进行评分。如果查询没有返回记录,说明用户还没有给图片打分,应该可以打分。
当用户尝试对图片评分时,当且仅当用户尚未对该图片评分时,您才需要insert 评分。假设 id 值为 5 的用户尝试对 id 为 10 的图片评分为 2:
insert into ratings(user_id, picture_id, value)
select 5, 10, 2
from ratings
where not exists (select 1
from ratings
where user_id = 5 and picture_id = 10)
当需要加载id为10的图片的评分时,需要做如下选择:
select avg(value) as picture_rating
from ratings
where picture_id = 10
如果您不想每次都计算这个平均值,那么您可以创建以下table:
aggregated_ratings(id, picture_id, value)
每当添加新评分时,请检查是否已经存在汇总评分,如下所示:
select 1
from aggregated_ratings
where picture_id = 10
如果你有记录,那么
update aggregated_ratings
set value = (select avg(value)
from ratings
where picture_id = 10)
where picture_id = 10;
如果没有,那么
insert into aggregated_ratings(picture_id, values)
select 10, avg(value)
from ratings
where picture_id = 10
注意,插入/更新到aggregated_ratings 应该在插入到ratings 之后执行。