用于计数和计算关系数据的SQL语句

用于计数和计算关系数据的SQL语句,sql,relation,Sql,Relation,我有一个主表“餐厅”和一对多关系到一个“RestaurantVotes”表。一家餐厅可以有多张选票。它的定义如下: CREATE TABLE `restaurant_votes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `created_at` datetime NOT NULL, `user_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `cat_food` int(11) NOT

我有一个主表“餐厅”和一对多关系到一个“RestaurantVotes”表。一家餐厅可以有多张选票。它的定义如下:

CREATE TABLE `restaurant_votes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL,
  `user_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `cat_food` int(11) NOT NULL,
  `cat_cart` int(11) NOT NULL,
  `cat_ambassador` int(11) NOT NULL,
  `cat_drinks` int(11) NOT NULL,
  `cat_service` int(11) NOT NULL,
  `cat_ambience` int(11) NOT NULL,
  `cat_price` int(11) NOT NULL,
  `restaurant_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_1B96C91EB1E7706E` (`restaurant_id`),
  CONSTRAINT `FK_1B96C91EB1E7706E` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurants` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `restaurants` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
对于API调用,我们需要获取所有餐厅的JSON响应,包括名称和该餐厅的总体评级。名称等不是问题,但我们有很大的问题,找到一个SQL查询,其中获得每个餐厅的评级。评级的计算方法如下:

CREATE TABLE `restaurant_votes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL,
  `user_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `cat_food` int(11) NOT NULL,
  `cat_cart` int(11) NOT NULL,
  `cat_ambassador` int(11) NOT NULL,
  `cat_drinks` int(11) NOT NULL,
  `cat_service` int(11) NOT NULL,
  `cat_ambience` int(11) NOT NULL,
  `cat_price` int(11) NOT NULL,
  `restaurant_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_1B96C91EB1E7706E` (`restaurant_id`),
  CONSTRAINT `FK_1B96C91EB1E7706E` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurants` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `restaurants` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  • 将所有类别(cat_*)的值(整数1-5)求和,并将其除以类别数(7)
  • 汇总上述评分结果,并将该值除以每个餐厅在餐厅投票表中的评分数
  • 从2返回总评分。在SQL查询中与餐厅名称一起输入
  • 使用SQL甚至可以做到这一点吗?有什么建议吗?谢谢

    SELECT r.name,r.id,score.rating
    FROM 
    restaurants as r
    INNER JOIN
    (
    SELECT restaurant_id,AVG(cat_food + cat_cart + cat_ambassador + cat_drinks + cat_service + cat_ambience + cat_price)/7 AS rating
    FROM restaurant_votes
    GROUP BY restaurant_id
    )as score
    ON r.id = score.rating
    
    这样行吗? 它获取餐馆表中定义的所有餐馆,并获取所有列相加的平均值除以7

    select 
    r.name, 
    sum(rv.cat_food + 
        rv.cat_cart +
        rv.cat_ambassador +
        rv.cat_drinks + 
        rv.cat_service +
        rv.cat_ambience +
        rv.cat_price) / 7 as total_score, 
    sum(rv.cat_food + 
        rv.cat_cart +
        rv.cat_ambassador +
        rv.cat_drinks + 
        rv.cat_service +
        rv.cat_ambience +
        rv.cat_price) / 7 / count(rv.id) as average_score
    from   restaurants r
    left join restaurant_votes rv
      on r.id = rv.restaurant_id
    group by r.name
    
    这样行吗? 它获取餐馆表中定义的所有餐馆,并获取所有列相加的平均值除以7

    select 
    r.name, 
    sum(rv.cat_food + 
        rv.cat_cart +
        rv.cat_ambassador +
        rv.cat_drinks + 
        rv.cat_service +
        rv.cat_ambience +
        rv.cat_price) / 7 as total_score, 
    sum(rv.cat_food + 
        rv.cat_cart +
        rv.cat_ambassador +
        rv.cat_drinks + 
        rv.cat_service +
        rv.cat_ambience +
        rv.cat_price) / 7 / count(rv.id) as average_score
    from   restaurants r
    left join restaurant_votes rv
      on r.id = rv.restaurant_id
    group by r.name
    
    我已经发布了一个示例来演示这一点


    我已经发布了一个例子来说明这一点。

    好吧,你试过什么了?你必须在一份声明中说明吗?您使用哪种脚本语言生成JSON,或者您的SQL服务器直接提供JSON响应?在原始SQL中没有。我们的webapp使用symfony2框架,并使用附带的QueryBuilder。但是我们无法访问自定义属性来计算QueryBuilder中的评级。该数据集包含约5000个条目,因此由于性能问题,我们需要从restaurant表中排除许多字段(我删除了上面sql中的大部分字段)。这就是为什么我们不能使用findAll()等现成函数的原因。我认为一条语句是唯一的方法,因为我们对编写原始sql语句知之甚少……那么,您尝试了什么?您必须在一条语句中使用它吗?您使用哪种脚本语言生成JSON,或者您的SQL服务器直接提供JSON响应?在原始SQL中没有。我们的webapp使用symfony2框架,并使用附带的QueryBuilder。但是我们无法访问自定义属性来计算QueryBuilder中的评级。该数据集包含约5000个条目,因此由于性能问题,我们需要从restaurant表中排除许多字段(我删除了上面sql中的大部分字段)。这就是为什么我们不能使用findAll()等现成函数的原因。我认为只有一条语句是唯一的方法,因为我们对编写原始sql语句知之甚少……选择了另一种解决方案。谢谢但是你会因为考虑这个问题而得到投票。选择另一个解决方案。谢谢但是你有权去考虑它。