SQL通过投票对产品进行排名

时间:2018-04-18 15:47:33

标签: mysql sql

我是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最受欢迎但得分较低。我想选择得分高,也很受欢迎的最佳产品。 请给我关于此案的建议。

非常感谢你!

3 个答案:

答案 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 表中添加两个字段:

  • rate_avg:该产品的平均评价
  • rate_total:评论总数

在进行 sql 查询时,您将使用 rate_avg 对产品进行排名,因此将向客户显示评分最高的产品。

每次进行新评论时,只需通过以下方式更新 rate_avg 和 rate_total 字段:

  • rate_avg = (rate_avg*rate_total + new_review_value) / (rate_total + 1)
  • rate_total = rate_total + 1