【问题标题】:PHP / SQL JOIN 2 tables and get an average scorePHP / SQL JOIN 2 个表并获得平均分
【发布时间】:2018-01-31 10:30:37
【问题描述】:

我正在尝试提供从 2017 年参加培训课程并就课程提供反馈的人收集的数据。

我想列出 2017 年开设的所有课程,并在每门课程旁边给出平均评分。

我正在使用的两个表是

courses
course_id   course_name
---------------------------
1         | Public speaking
2         | Social media skills


feedback
course_id   overall_rating
--------------------------
1         |  3
1         |  5
1         |  4
1         |  4
2         |  3
2         |  3
2         |  4

我可以得到课程列表

$yearscourses = "SELECT courseid,coursetitle FROM courses WHERE coursedate1 BETWEEN '2017-01-01' AND '2017-12-31'";
$yearsresult = mysqli_query($connect, $yearscourses);

平均评分与

$avgrating = "SELECT AVG(overall_rating) FROM feedback WHERE courseid='courseid'";

但我正在努力使用 HTML / PHP 在表格中呈现这一点。 我尝试了以下方法,但它只是在每一行中重复相同的平均值。

<table cellspacing="0" table border="1" cellpadding="padding:5px;">
<tr style="font-size:20px; font-weight:bold; text-align:center;">
<td colspan="4">
2017
</td>
</tr><tr style="font-weight:bold;">
<td style="background-color:#AED6F1;">Course ID</td><td style="background-color:#AED6F1;">Course title</td><td style="background-color:#AED6F1;">Average rating</td>
</tr>

<?php

// Get a list of all courses for the year
$yearscourses = "SELECT courseid,coursetitle FROM courses WHERE coursedate1 BETWEEN '2017-01-01' AND '2017-12-31'";
$yearsresult = mysqli_query($connect, $yearscourses);


if (mysqli_num_rows($yearsresult) != 0) // Search has found results
{
$str = "\n";

}

while ($row = mysqli_fetch_array($yearsresult, MYSQLI_ASSOC)) {

// Get average rating for each course
$avgrating = "SELECT AVG(overall_rating) FROM feedback WHERE courseid='courseid'";
$avgresult = mysqli_query($connect, $avgrating);
foreach($avgresult as $row2) {

echo "<tr><td>" . $row['courseid']. "</td><td>" .$row['coursetitle']. "</td><td>".$row2['AVG(overall_rating)']."</td></tr>\n";
    $str .= " ";
}
}
$str .= "</table>\n</div>";
echo $str;


?>

【问题讨论】:

    标签: php html mysql sql join


    【解决方案1】:

    正如另一篇文章所指出的,您可以使用别名轻松访问循环中的值。话虽如此,您应该避免在循环内执行查询。您可以利用GROUP BY 子句检索相同的信息。

    这是加入feedback 表时的情况:

    SELECT c.courseid, c.coursetitle, AVG(f.overall_rating) AS average_rating 
    FROM courses c 
    LEFT JOIN feedback f ON f.courseid = c.courseid
    WHERE c.coursedate1 BETWEEN '2017-01-01' AND '2017-12-31'
    GROUP BY f.courseid
    

    请注意,使用此查询,未收到任何反馈的课程将具有average_ratingNULL 值。

    【讨论】:

    • 太好了。这正是我所需要的,谢谢。
    【解决方案2】:

    使用别名表示平均值

     $avgrating = "SELECT AVG(overall_rating) as average_rating FROM feedback WHERE courseid='courseid'"; // use alias for avereage
    

    在循环中

    echo "<tr><td>" . $row['courseid']. "</td><td>" .$row['coursetitle']. "</td><td>".$row2['average_rating']."</td></tr>\n";
    

    【讨论】:

      【解决方案3】:

      你只需要这样做

      $avgrating = "SELECT AVG(overall_rating) FROM feedback WHERE courseid='".$row['courseid']."'";
      

      而不是那个

      $avgrating = "SELECT AVG(overall_rating) FROM feedback WHERE courseid='courseid'";
      

      【讨论】:

        猜你喜欢
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-28
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多