說我有兩張桌子。 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'不應該對第二個子查詢可見。 –