【问题标题】:pdo list top 5 using avg?pdo 使用 avg 列出前 5 名?
【发布时间】:2016-09-15 16:39:46
【问题描述】:

好吧,我又一次在努力制定我的电影分级系统:(

我的表结构是

      ID | UserID | Rating | TMDB |  TYPE
      -----------------------------------
       1      34        6     432      2
      -----------------------------------
       2      34        9     432      3
      -----------------------------------
       3      44        9     468      2

感谢用户 Barmar,我能够计算出平均值

$sql = "SELECT AVG(rating) AS avg_rating FROM `tbl_rating` WHERE `tmdb`= :tmdb AND `type`= :type ";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':tmdb', $tmdb);
$stmt->bindParam(':type', $type);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$avg_rating = $row['avg_rating'];

现在我想列出血腥恐怖的前 5 名(类型 = 2)。我完全不知道如何解决这个问题:(我知道我可以在最后通过一个简单的 LIMIT 命令来限制结果,我认为 ORDER by AVG(rating) 是需要的?我需要删除 WHERE tmdb。我有不知道如何实现这一点,任何人都可以帮忙!

【问题讨论】:

  • 如果我在列上使用 avg,它会将它们全部加起来,而不是我需要将它们加到 tmdb 组 ID 中?我希望这能引起人们的注意,因为我的大脑已经变成糊状了

标签: php mysql database pdo


【解决方案1】:

您可以将查询修改为按 tmdb 分组(而不是过滤依据),按 avg_rating (降序)对结果进行排序并将返回的行数限制为 5。如下所示:

SELECT `tmdb`, AVG(rating) AS avg_rating
FROM `tbl_rating`
WHERE `type`= :type
GROUP BY `tmdb`
ORDER BY avg_rating DESC
LIMIT 5

概念证明:

您可以在 MySQL 控制台中运行以下 SQL 命令,以验证查询是否对您的示例数据返回了合理的结果。

create table tbl_rating (
ID int unsigned primary key auto_increment,
UserID int unsigned,
Rating smallint unsigned,
tmdb int unsigned,
type int unsigned) engine=innodb;

insert into tbl_rating
(UserId, Rating, tmdb, `type`) values
(34, 6, 432, 2),
(34, 9, 432, 3),
(44, 9, 468, 2);

SELECT `tmdb`, AVG(rating) AS avg_rating
FROM `tbl_rating`
WHERE `type`= 2
GROUP BY `tmdb`
ORDER BY avg_rating DESC
LIMIT 5;

+------+------------+
| tmdb | avg_rating |
+------+------------+
|  468 |     9.0000 |
|  432 |     6.0000 |
+------+------------+
2 rows in set (0.01 sec)

【讨论】:

  • 这看起来像我需要的,但是由于某种原因我得到了一个错误
  • 致命错误:在第 39 行的 C:\wamp\www\rating_results.php 中带有消息“SQLSTATE[HY093]:参数编号无效:参数未定义”的未捕获异常“PDOException”
  • and PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\wamp\www\rating_results.php on line 39
  • 这是我的 sql: $sql = "SELECT tmdb, AVG(rate) AS avg_rate FROM tbl_rating WHERE type= :type GROUP BY tmdb ORDER BY avg_rate DESC LIMIT 5 ";
  • 删除这一行:$stmt->bindParam(':tmdb', $tmdb),因为我从查询中删除了:tmdb 上的过滤器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多