PHP/MySQL 连接语句

Posted

技术标签:

【中文标题】PHP/MySQL 连接语句【英文标题】:PHP/MySQL join statement 【发布时间】:2014-01-14 16:12:55 【问题描述】:

我正在尝试使用 mysqlAVG 为商品列表创建平均评分,然后在目录列表页面上的每个商店旁边显示平均值。

每次有人对商店发表评论时,他们都会给出 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',

【问题讨论】:

旁注: 停止使用已弃用的 mysql_* 函数。请改用MySQLi 或PDO。 你有 r.store_name 吗?也许你的意思是 r.retailer_id? 请不要使用真正糟糕的mysql_query 界面。这里的问题是您得到false 而不是资源,您的查询不起作用,因此您无法获取它。 PDO 可以发出更难以错过的异常。在创建更多必须重写的遗留代码之前停止使用mysql_query 您应该检查查询是否成功。如果没有,你应该调用die(mysql_error()) 来查看我的SQL 的错误。 @Fred-ii- 我认为你的观点很有道理,我正在使用 codeigniter 来学习,但是有很多我不明白的东西我想要。我觉得我可以用直接的 php 做更多的事情,并且我正在通过这种方式了解更多关于 MySQL 的知识。 【参考方案1】:

您的 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

【讨论】:

您是说要从AVG(r.rating) AS avg_rating 中删除avg_rating 并使用rating 作为echo 语句中的变量吗? 不,我是说您的 SQL 查询没有运行。使用 GROUP BY 时,您的选择中的所有项目都需要是聚合函数或在分组子句中指定。查看我的答案中的 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 at line 1

以上是关于PHP/MySQL 连接语句的主要内容,如果未能解决你的问题,请参考以下文章

php mysql怎么实现删除功能?

php mysql

PHP+MySQL数据库编程的步骤

php+mysql 请问:用pdo如何获取某个表中记录的数目?

php mysql怎样得到查询数据库里面数字的累计数

php+mysql 请问:用pdo如何获取某个表中记录的数目?