PHP/MySQL 连接语句
Posted
技术标签:
【中文标题】PHP/MySQL 连接语句【英文标题】:PHP/MySQL join statement 【发布时间】: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',
【问题讨论】:
旁注: 停止使用已弃用的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 连接语句的主要内容,如果未能解决你的问题,请参考以下文章