【发布时间】:2014-01-14 16:12:55
【问题描述】:
我正在尝试使用 MySQL 的 AVG 为商品列表创建平均评分,然后在目录列表页面上的每个商店旁边显示平均值。
每次有人对商店发表评论时,他们都会给出 1-5 的评分,该评分会插入到 TABLE reviews 列中的 rating 中。
存储数据来自TABLE reviews,表关系来自两个表中名为store_id 的列。我尝试使用 join 语句来获取每个商店旁边显示的平均值。
这是带有连接语句的评级循环中的当前代码:
<?php echo "<table>\n";
echo "<tr><th>Store ID</th><th>Rating</th></tr>\n";
$result1 = mysql_query("SELECT s.store_id AVG(r.rating) AS avg_rating
FROM stores as s
JOIN reviews as r ON s.store_id = r.store_name
GROUP BY s.store_id");
while ($row1 = mysql_fetch_assoc($result1)) {
echo "<tr><td>$row1[store_id]</td><td>$row1[avg_rating]</td></tr>\n";
}
echo "</table>\n";?>
echo "</table>\n";?>
这是我遇到的 SQL 错误
您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 '(r.rating) AS avg_rating FROM stores' 附近使用的正确语法
这是我得到的 PHP 错误:
警告:mysql_fetch_assoc() 期望参数 1 是资源,在第 227 行的 /home/shopping/public_html/retailers.php 中给出布尔值
第 227 行是上面代码中的这一行:
while ($row1 = mysql_fetch_assoc($result1)) {
这是我的表的两种结构:
CREATE TABLE `stores` (
`store_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`store_name` varchar(255) NOT NULL DEFAULT '',
CREATE TABLE `reviews` (
`rating_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`store_id` int(11) NOT NULL DEFAULT '0',
`rating` tinyint(1) NOT NULL DEFAULT '0',
【问题讨论】:
-
你有 r.store_name 吗?也许你的意思是 r.retailer_id?
-
请不要使用真正糟糕的
mysql_query界面。这里的问题是您得到false而不是资源,您的查询不起作用,因此您无法获取它。 PDO 可以发出更难以错过的异常。在创建更多必须重写的遗留代码之前停止使用mysql_query。 -
您应该检查查询是否成功。如果没有,你应该调用
die(mysql_error())来查看我的SQL 的错误。 -
@Fred-ii- 我认为你的观点很有道理,我正在使用 codeigniter 来学习,但是有很多我不明白的东西我想要。我觉得我可以用直接的 php 做更多的事情,并且我正在通过这种方式了解更多关于 MySQL 的知识。