【问题标题】:MySQL table JOIN with ordering by averagesMySQL 表 JOIN,按平均值排序
【发布时间】:2012-06-28 00:59:55
【问题描述】:

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

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

表格:

链接

  • link_id PK int 自动增量
  • 网址 varchar
  • 标题varchar
  • 描述文本
  • 评级十进制

link_ratings

  • link_rating_id PK int 自动增量
  • link_id FK int
  • user_id FK int
  • 评级十进制

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

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

我无法找到太多信息,很可能是由于我缺乏 SQL 知识,甚至无法了解如何开始。

感谢任何帮助。谢谢。

【问题讨论】:

  • 请提供示例数据和所需的输出。

标签: mysql sql


【解决方案1】:

您无需在links 表中保留rating 平均值。我在下面计算它,这应该表现得相当好:

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

【讨论】:

  • 实际上,我试图总结和平均的价值是在 link_ratings 中的评级。表 links 中的每个链接都有许多 link_rating 条目。
  • 太棒了。这正是我需要的。非常感谢。为清楚起见的一件事:l => links 和 lra => link_ratings 对吗?这只是替换名称?
  • @ahhchuu 是的,它们被称为aliases,可以使您的查询更具可读性。多次加入同一个表时也需要它们,以便您可以分别引用每个表。 (在这种情况下,lra 是 Link_Ratings Average 的缩写)。
【解决方案2】:

正确的数据设计会告诉您实际上不要存储平均评分。在大多数情况下,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;

【讨论】:

  • 我希望我不需要存储平均值。很高兴看到我没有。感谢您的信息和链接。我会研究TRIGGERS,所以当我确实需要它们时,我会更好地理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多