说我有两张桌子。 businesses
和reviews
为企业。Mysql贝叶斯和按星级评分
businesses
表:
+----+-------+
| id | title |
+----+-------+
reviews
表:
+----+-------------+---------+------+
| id | business_id | message | rate |
+----+-------------+---------+------+
每个评论有一个rate
(1到5星)
我想他们的评论率对企业进行排序,根据Bayesian Ranking
条件至少有2条评论。
这里是我的查询:
SELECT b.id,
(SELECT COUNT(r.rate) as rr FROM reviews r WHERE r.business_id = b.id) as rr,
(SELECT
((COUNT(r.rate)/(COUNT(r.rate) + 2)) AVG(r.rate) +
(2 /(COUNT(r.rate) + 2)) 4)
FROM reviews r where r.business_id = b.id AND rr > 2
) as score
FROM businesses b
order by score desc
LIMIT 4
这将输出我:
+------+----+------------+
| id | rr | score |
+------+----+------------+
| 992 | 14 | 4.31250000 |
+------+----+------------+
| 237 | 3 | 4.2000000 |
+------+----+------------+
| 19 | 5 | 4.0000000 |
+------+----+------------+
| 1009 | 12 | 3.9285142 |
+------+----+------------+
我有两个问题:
当你看到在
((COUNT(r.rate)/(COUNT(r.rate) + 2)) AVG(r.rate) + (2 /(COUNT(r.rate) + 2)) 4) FROM reviews r where r.business_id = b.id AND rr > 2)
一些功能正在运行更多比一次,如COUNT
或AVG
。他们是否在后台运行一次,也许缓存resuslt?或运行每一个电话?是否有任何等效查询,但更优化?
在此先感谢。
你甚至能得到'正确'的答案吗?我认为'rr'不应该对第二个子查询可见。 –