Скажем, у меня есть две таблицы. businesses
и reviews
для предприятий.Mysql Bayesian и сортировать по звездам
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
. они работают один раз в фоновом режиме и, возможно, кэшируют результ? ИЛИ запускать для каждого звонка?Есть ли эквивалентный запрос для этого, но более оптимизирован?
благодарит заранее.
Вы даже получите «правильный» ответ? Я думаю, что 'rr' не должно быть видимым для второго подзапроса. –