SQL-统计计算关系数据的语句

SQL-Statement for counting and calculating relational data

我有一个 main-table "Restaurants" 和一个与 "RestaurantVotes" table 的一对多关系。一间餐厅可以有多个投票。它是这样定义的:

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 查询来获取每家餐厅的评级。评分是这样计算的:

  1. 将所有类别(cat_*)的值(整数1-5)相加除以类别数(7)。
  2. 汇总上述评分结果,然后将数值除以每个餐厅 restaurant_votes table 中的评分数。
  3. Return 2. 在 SQL-query 中与餐厅名称一起的总体评分。

这甚至可以使用 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

这行得通吗? 它获取餐厅 table 中定义的所有餐厅,然后获取所有列相加并除以 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

我已经发布了一个 SQLFiddle 来证明这一点。