【问题标题】:Average and comparative left join MySQL平均和比较左连接 MySQL
【发布时间】:2016-03-02 18:15:55
【问题描述】:

我正在尝试从 2 个不同的 MySQL 表中获取信息。

主表是这个:

从这个我使用信息得到平均率:

我如何编写一个 SQL 查询,通过计算所有带有 rating_house = house_id 的行来获得 average 评级,并按最高评级排序,如果评级相同,则按最高评级排序。

这是我自己想出来的:

$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>";
    }
}

但是我没有输出?

【问题讨论】:

  • 请注意,MySQL(以及我所知道的所有 SQL 方言,包括 ANSI 标准)中用于排序结果的关键字是 ORDER BY,而不是 SORT BY

标签: php mysql sql average


【解决方案1】:

如果您知道相关行必须存在,请使用 INNER JOIN 而不是 LEFT JOIN。

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

【讨论】:

  • 有没有办法实现,如果没有给出评级,它仍然会显示?但在底部
  • 如果没有评级存储为 NULL,则它们的平均值应返回为 NULL。如果这不起作用,请将 r.rating_structure 和其他包装在 IFNULL(r.rating_structure, 0) 中。这样 NULL 将平均为零,并将显示在底部。
  • 太好了,谢谢 :) 另外,我可以正确计算以在等费率之间进行拆分。你刚刚更新了吗?
  • 修正马特,所有评分都已设置,但是如果没有评分条目怎么办?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 2016-07-29
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多