首先,我对MySQL不是很了解,所以对我很轻松。我甚至不确定如何说出我的问题。
我有两张桌子;一个表包含有关链接的信息,用户对每个链接的其他评级。从本质上讲,我只需要通过评级平均值来订购链接表。
TABLES:
链接
link_ratings
我需要的是当有人为链接添加链接评级(新的link_ratings条目)或更新其当前评级时,该链接的所有评级都会在链接中的评级列上进行平均和更新。或者我可以完全废弃链接表中的评级列并使用JOIN吗?
如果是这样,我将如何进行JOIN。如果没有,我如何制作能够为我完成此任务的TRIGGER?
我无法找到很多信息,很可能是因为我缺乏SQL知识,甚至找不到这些信息。
感谢任何帮助。感谢。
答案 0 :(得分:3)
您无需在rating
表格中保留links
平均值。我在下面计算它,这应该表现得相当不错:
select l.link_id,
l.url,
l.title,
l.description,
lra.AvgRating
from links l
left outer join (
select link_id, avg(rating) as AvgRating
from link_ratings
group by link_id
) lra on l.link_id = lra.link_id
order by lra.AvgRating desc
答案 1 :(得分:1)
正确的数据设计会告诉您实际上并未存储平均评分。在大多数情况下,MySQL可以足够快地计算出来。保留所有link_ratings
但是到了显示实际评分时,请加入link_ratings
到links
并使用MySQL AVG()
function.
但是,如果您确实需要每次触发,请查看MySQL's TRIGGER Documentation。类似以下未经测试的伪代码将帮助您
CREATE TRIGGER trig AFTER UPDATE ON link_ratings
FOR EACH ROW BEGIN
UPDATE links
SET links.rating = <new average>
WHERE links.link_id = NEW.link_id;
END;