用于计数和计算关系数据的SQL语句
我有一个主表“餐厅”和一对多关系到一个“RestaurantVotes”表。一家餐厅可以有多张选票。它的定义如下:用于计数和计算关系数据的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
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;
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语句知之甚少……选择了另一种解决方案。谢谢但是你会因为考虑这个问题而得到投票。选择另一个解决方案。谢谢但是你有权去考虑它。