Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 平均和比较左连接MySQL_Php_Mysql_Sql_Average - Fatal编程技术网

Php 平均和比较左连接MySQL

Php 平均和比较左连接MySQL,php,mysql,sql,average,Php,Mysql,Sql,Average,我试图从两个不同的MySQL表中获取信息 主表如下所示: 从这一条中,我使用这些信息来获得平均速率: 我如何编写一个SQL查询,通过计算所有具有评级\u house=house\u id的行,并按最高评级排序,如果评级相等,则按最高评级排序 这就是我自己的想法: $sql = "SELECT l.location_address, " . "r.rating_structure+r.rating_inventory+r.rating_service/3 AS aver

我试图从两个不同的MySQL表中获取信息

主表如下所示:

从这一条中,我使用这些信息来获得平均速率:

我如何编写一个SQL查询,通过计算所有具有
评级\u house=house\u id
的行,并按最高评级排序,如果评级相等,则按最高评级排序

这就是我自己的想法:

$sql = "SELECT l.location_address, "
            . "r.rating_structure+r.rating_inventory+r.rating_service/3 AS average "
            . "FROM houses h "
            . "LEFT JOIN rating r ON h.house_id = r.rating_house "
            . "LEFT JOIN location l ON h.house_address = l.location_id "
            . "WHERE h.house_deleted IS NULL SORT BY average DESC LIMIT 10";
$result = $db_connect->prepare($sql);
if($result->execute()){
    while($user_data = $result->fetch(PDO::FETCH_ASSOC)){
        $user_data['location_address']."<br>";
    }
}
$sql=“选择l.location\u地址,”
. “r.评级结构+r.评级库存+r.评级服务/3作为平均值”
. “来自h”
. “h.house_id上的左连接额定值r=r.rating_house”
. “h.house\u address=l.location\u id上的左连接位置l”
. “其中h.house_deleted为空,按平均DESC LIMIT 10排序”;
$result=$db_connect->prepare($sql);
如果($result->execute()){
而($user_data=$result->fetch(PDO::fetch_ASSOC)){
$user_data['location_address']。“
”; } }

但是我没有得到任何输出?

为了提高性能,如果您知道相关行必须存在,请使用内部联接而不是左联接

SELECT l.location_address,
       (SUM(r.rating_structure)+SUM(r.rating_inventory)+SUM(r.rating_service))/3 AS average 
FROM houses h
INNER JOIN rating r ON h.house_id = r.rating_house
INNER JOIN location l ON h.house_address = l.location_id 
WHERE h.house_deleted IS NULL 
GROUP BY l.location_address
ORDER BY 2, 
         (SUM(r.rating_structure)+SUM(r.rating_inventory)+SUM(r.rating_service)) DESC
LIMIT 10

以下查询应返回按平均评级排序的房屋:

select h.house_id, (sum(hr.rating_structure) + sum(rating_inventory) + sum(rating_service))/3 as "average"
from house h left outer join house_rating hr on h.house_id = hr.rating_house
group by h.house_id
order by average

请注意,MySQL(以及我所知道的所有SQL方言,包括ANSI标准)中用于排序结果的关键字是
orderby
,而不是
sortby
。是否有一种方法可以实现,以便在没有给出评级的情况下,它仍会显示?但在底部,如果没有评级存储为空,那么它们的平均值应该返回为空。如果这不起作用,将r.rating_结构和其他结构包装在IFNULL中(r.rating_结构,0)。通过这种方式,空值被平均为零,并将显示在底部。很好,谢谢:)此外,我可以让它正确计数,以便在速率相等时进行分割。你刚刚更新了吗?马特,所有评级都设置好了,但是如果没有评级条目呢?