【问题标题】:SQL for Ranking products by vote通过投票对产品进行排名的 SQL
【发布时间】:2018-04-18 15:47:32
【问题描述】:

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

非常感谢!

【问题讨论】:

  • 如果你只想要产品 id 那么产品和用户表是无关紧要的,你想对抽奖做什么?
  • 我想选择 5 个质量最好的产品,按投票和分数排名(通过添加评论,一个用户投票,他们为产品设置分数)。你能重新检查更新的样本数据吗?
  • 这真的取决于你想怎么做。例如,您肯定首先想要评分和人气最高的东西,但如果不是这样呢?当某些东西不受欢迎但评分很高时会发生什么?如果某项评分高但不受欢迎怎么办?您如何期望这些案件按顺序出现?
  • 你完全正确。我无法定义什么是最好的产品,最受欢迎或高评价会产生更大的影响。在现实世界中,哪种产品是最好的。你能给我建议,甚至是关于心态的建议吗?非常感谢!

标签: mysql sql


【解决方案1】:

你想要一个加权排名

这是一个加权排名的例子

    +---+---+---+---+---+---+
    | 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 = 一个(几乎)任意常数。在上面的例子中,它等于项目的总数。

【讨论】:

  • 您现在掌握的信息与我开始回答这个问题时一样多。
  • 我在这里找到了一个案例研究mathforum.org/library/drmath/view/72033.html。作为您推荐的关键字“加权排名”,它确实符合我的需求。非常感谢!
【解决方案2】:

希望对你有帮助

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

【讨论】:

    【解决方案3】:

    删除评论表。您只需在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多