我是SQL的新手。 我正在开发一种对产品进行排名的功能。每个产品均由用户评分,评分为1-5星。我想选择5个最高分和最受欢迎(最受很多人评价)的顶级产品。 我怎么能写sql?
说明
表:
- Review table -
product id,
user id,
score
- Product table -
product id,
product name
- User table -
user id,
user name
每个用户都可以评价许多产品
预期回报:5个产品ID 得分最高,最受欢迎(由很多人评分)。
示例数据:
A: 5, 4, 4, 3, 1 (5 voted)
B: 5, 4, 3 (3 voted)
C: 1, 2, 1, 1, 2, 1 (6 voted)
D: 5 (1 voted)
E: 5, 4 (2 voted)
F: 5, 5 (2 voted)
D是最高分但不受欢迎,C最受欢迎但得分较低。我想选择得分高,也很受欢迎的最佳产品。 请给我关于此案的建议。
非常感谢你!
答案 0 :(得分:0)
您想要加权排名
这是加权排名的一个例子
+---+---+---+---+---+---+
| A | B | C | D | E | F |
+---+---+---+---+---+---+
| 5 | 5 | 1 | 5 | 5 | 5 |
| 4 | 4 | 2 | 4 | 5 | |
| 4 | 3 | 1 | | | |
| 3 | | 1 | | | |
| 1 | | 2 | | | |
| | | 1 | | | |
+---+---+---+---+---+---+
r |3.4|4.0|1.3|5.0|4.5|5.0|
v |5.0|3.0|6.0|1.0|2.0|2.0|
m |6.0|6.0|6.0|6.0|6.0|6.0|
+---+---+---+---+---+---+
WR |2.0|2.0|1.2|1.6|1.9|2.0|
+---+---+---+---+---+---+
其中
WR = (v/(v+m))*r+(m/(v+m))
R =商品的平均评分
v =该项目的投票数
m =(几乎)任意常数。在上面的示例中,它等于项目总数。
答案 1 :(得分:0)
希望这有帮助
SELECT product_id, product_name, COUNT(score), AVG(score)
FROM product p
INNER JOIN review r ON r.product_id = p.product_id
INNER JOIN `user` u ON u.user_id = r.user_id
GROUP BY r.product_id
ORDER BY AVG(r.score) DESC, COUNT(r.score) DESC
答案 2 :(得分:0)
删除评论表。您可以简单地在 Product 表中添加两个字段:
在进行 sql 查询时,您将使用 rate_avg 对产品进行排名,因此将向客户显示评分最高的产品。
每次进行新评论时,只需通过以下方式更新 rate_avg 和 rate_total 字段: