MySQL:GROUP_CONCAT、AVG 和 COUNT 的问题

标签 mysql

我有一个 mySQL 语句,如下所示。它尝试选择所有餐厅(每行 1 个),将每个餐厅的美食(因为每个餐厅可能有 1 个或多个美食)连接到每个餐厅的一列中,平均评分和评分数量也是如此。

我设置了 3 家测试餐厅。餐厅 1 有 2 种美食类型和 3 个等级。问题是评分的数量返回实际值的两倍,而美食返回为(cuisine1 3 次然后 cuisine2 3 次)例如(菜系 1、菜系 1、菜系 1、菜系 2、菜系 2、菜系 2)。你知道是什么原因造成的吗?感谢您的帮助。

SELECT
  r.*,
  GROUP_CONCAT(c.cuisine SEPARATOR ', ') cuisine,
  ROUND(AVG(re.avg_rating),1) rating,
  COUNT(re.restaurant_id) num_ratings
FROM eat_eat_restaurants r
JOIN eat_eat_restaurant_cuisines_lookup rc ON (r.restaurant_id=rc.restaurant_id)
JOIN eat_eat_cuisines c ON (rc.cuisine_id=c.cuisine_id)
LEFT JOIN eat_eat_reviews re ON (r.restaurant_id=re.restaurant_id)
WHERE r.published=1
GROUP BY r.restaurant_id

最佳答案

GROUP BY 对结果进行分组,而不是单独对表进行分组。

在你的情况下你想要

  1. 餐厅信息。
  2. 美食。
  3. 收视率。

由于“菜系”和“评分”之间没有相互依赖关系,所以需要将其中一个单独分组:

SELECT
  r.*,
  GROUP_CONCAT(c.cuisine SEPARATOR ', ') cuisine,
  reg.rating,
  reg.num_ratings
FROM eat_eat_restaurants r
    JOIN eat_eat_restaurant_cuisines_lookup rc ON r.restaurant_id=rc.restaurant_id
    JOIN eat_eat_cuisines c ON rc.cuisine_id=c.cuisine_id
    LEFT JOIN (
        SELECT re.restaurant_id,
            ROUND(AVG(re.avg_rating),1) rating,
            COUNT(re.restaurant_id) num_ratings
        FROM eat_eat_reviews re
        GROUP BY re.restaurant_id
    ) reg ON r.restaurant_id=reg.restaurant_id
WHERE r.published=1
GROUP BY r.restaurant_id

关于MySQL:GROUP_CONCAT、AVG 和 COUNT 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4910738/

相关文章:

php - 在现有发票中添加新发票行不起作用

php - php表单的输入字段显示数据库用户名和密码

php - 它足够好和安全吗?为特定页面建立附加连接

mysql - mysql 在将成功返回给客户端之前是否将请求的修改写入文件系统

php - 在 centos 6.5 中安装 laravel 4 时遇到问题

mysql - mysql查询中find_in_set中的逗号分隔字符串是否有限制

mysql - wamp 服务器中的服务器没有响应(或本地 MySQL 服务器的套接字配置不正确)

mysql - 如何更改所有 ID、JOIN 和连接的记录

php - codeigniter 将日期插入通过 post 方法发送的数据库中

来自多个表的 mySQL SELECT 给出了错误的信息