我尝试使用 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 错误
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(r.rating) AS avg_rating FROM stores'
这是我遇到的 PHP 错误:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /home/shopping/public_html/retailers.php on line 227
第 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',
最佳答案
您的 SQL 查询无效。您需要从查询中省略 s.store_name
或将其包含在 GROUP BY
SELECT
s.store_id,
s.store_name,
AVG(r.rating) AS
FROM stores as s
JOIN reviews as r ON s.store_id = r.store_id
GROUP BY s.store_id, s.store_name
关于PHP/MySQL 连接语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20794425/