【问题标题】:Best average rating最佳平均评分
【发布时间】:2020-02-05 06:36:40
【问题描述】:

我为新闻文章创建了一个简单的评级系统。新闻文章存储在称为“文章”的数据库表中。每篇文章都有一个唯一的 id,从 1 开始。

所以我有 2 篇文章,ID 1 和 ID 2。

我还有一个名为“ratings”的表,其中包含用户唯一 ID、文章 ID 和用户给出的评分。

如果我给 ID 2 的文章 5/5 星评级,它将进入“评级”表,文章 ID 为 2,我的用户 ID 和评级为 5。

我已经弄清楚如何显示每篇文章的平均评分,但我想了解如何按降序显示文章的最佳平均评分。这有可能吗?这怎么可能?

这是我找到平均值的方法:

<?
    $votesForThis = 0;
    $sql = "SELECT * FROM ratings WHERE articleID = ".$articleID." ORDER BY id ASC";
    // Check if there are results
    if ($result = mysqli_query($con, $sql)) {
        // Loop through each row in the result set
        while($row = mysqli_fetch_assoc($result)) {
            $votesForThis++;
        }
    }


    $result = mysqli_query($con, 'SELECT SUM(vote) AS vote_sum FROM ratings WHERE articleID=' . $articleID);
    $row = mysqli_fetch_assoc($result); 
    $voteSum = $row['vote_sum'];

    $averageVotes = $voteSum / $votesForThis;
?>

【问题讨论】:

    标签: php sql average


    【解决方案1】:

    MySQL 有一个avg 函数,您可以使用它来代替自己实现这个逻辑。从那里开始,只需按文章 ID 分组并按平均值排序:

    SELECT   articleID, AVG(vote)
    FROM     ratings
    GROUP BY articleID
    ORDER BY 2 DESC
    

    【讨论】:

    • ORDER BY 2 是什么意思?不应该是通过 AVG(vote) 订购吗?当我使用您的代码时,它只会显示为那里的所有选票。我需要它来显示按最佳平均评分排序的所有文章
    • 对不起我的错误。它就像一个魅力。但我仍然想知道 ORDER BY 2 的作用是什么?
    • @MalthePedersen "2" 这里指的是选择列表中的第二列。相当于你建议的ORDER BY AVG(vote)
    【解决方案2】:

    执行此操作的最佳做​​法是在您的文章表中添加一个名为 average_rating 的新列,并使用 cron 作业或在每次投票后对其进行更新。

    请记住,一段时间后,您的评分表会变得很大,并且在每次页面刷新时计算平均评分会给您的服务器带来巨大的负载。

    【讨论】:

      【解决方案3】:

      我会在这个中使用反规范化。 我会使用触发器来更新以前在表格文章上创建的列,该列将存储它的平均评分。

      我会发布一个触发器示例,但您还没有发布您使用的是哪个数据库。

      Mysql:https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

      Postgresql:https://www.postgresql.org/docs/9.1/sql-createtrigger.html

      每次评分完成、更新或删除时,触发器都会使用内置的 avg 函数使用当前平均值更新此列。

      最后,您只需在按此评级列 desc 排序的文章表上创建一个选择。

      并在此平均评分列上创建索引以获得更快的结果。

      【讨论】:

        【解决方案4】:
        SELECT   articleID, AVG(vote)
        FROM     ratings
        
        GROUP BY articleID,vote
        
        ORDER BY  DESC
        

        使用了这个查询

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-31
          • 1970-01-01
          • 1970-01-01
          • 2019-07-06
          相关资源
          最近更新 更多