MySQL表JOIN按平均排序

时间:2012-06-26 16:33:52

标签: mysql sql

首先,我对MySQL不是很了解,所以对我很轻松。我甚至不确定如何说出我的问题。

我有两张桌子;一个表包含有关链接的信息,用户对每个链接的其他评级。从本质上讲,我只需要通过评级平均值来订购链接表。

TABLES:

链接

  • link_id PK int autoincrement
  • url varchar
  • title varchar
  • description text
  • 评级十进制

link_ratings

  • link_rating_id PK int autoincrement
  • link_id FK int
  • user_id FK int
  • 评级十进制

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

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

我无法找到很多信息,很可能是因为我缺乏SQL知识,甚至找不到这些信息。

感谢任何帮助。感谢。

2 个答案:

答案 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_ratingslinks并使用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;