0

首先,我对 MySQL 还不是很好,所以请放轻松。我什至不知道如何表达我的问题。

我有两张桌子;一个表包含有关链接的信息,以及用户对每个链接的其他评级。本质上,我只需要能够按平均评分对链接表进行排序。

表格:

链接

  • link_id PK int 自动增量
  • url varchar
  • 标题 varchar
  • 描述 文字
  • 评分小数

链接评级

  • link_rating_id PK int 自动增量
  • link_id FK int
  • user_id FK int
  • 评分小数

我需要的是当有人向链接添加链接评级(新的 link_ratings 条目)或更新他们当前的评级时,该链接的所有评级都会在链接中的评级列上进行平均和更新。或者我可以完全取消链接表中的评级列并使用 JOIN 吗?

如果是这样,我将如何进行 JOIN。如果没有,我如何制作可以为我完成此任务的 TRIGGER?

我找不到太多关于如何开始的信息,很可能是由于我缺乏 SQL 知识。

任何帮助表示赞赏。谢谢。

4

2 回答 2

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
于 2012-06-26T16:38:47.657 回答
1

适当的数据设计会告诉您实际上不要存储平均评分。在大多数情况下,MySQL 可以足够快地计算这一点。保留所有,link_ratings但当需要显示实际评级时,使用MySQL函数link_ratings加入links并计算平均值。AVG()

但是,如果您确实需要每次都触发,请查看MySQL 的 TRIGGER 文档。类似以下未经测试的伪代码将帮助您

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;
于 2012-06-26T16:43:09.170 回答