我有一个电影列表,用户可以使用jQuery UI Sortable按照他们最喜欢的顺序排列(一切正常)。订单号越低,薄膜(1)越好,薄膜越高(26)越差。电影列表可能是无穷无尽的,但在数据库中是固定的(用户无法添加更多),因此用户只能从x列表中选择。
电影不必在用户列表中,如果他们没有看过电影5那么它就不会被包含在内(这可能会使问题更加复杂)。
目前,它存储在表格中:
film_id | user_id | order
4 2 3
5 3 3
6 2 1
7 2 2
7 3 1
8 3 2
我想要的,不知道从哪里开始是一个整体的“十大”风格列表。即电影7是最受欢迎的,因为它看起来更高的民族名单,并在更多的名单。电影6可能是最受欢迎的,但它只在一个列表中?!
我坚持使用逻辑和Mysql查询来做到这一点!
我想我可能需要以某种方式加权?或者有一个单独的表格,每部电影的分数,并在每次编辑后更新。以下查询似乎是正确的想法,如果它只是基于表中的项目数,而不是当我想在方程中添加位置时。
SELECT ff.film_id, COUNT(ff.film_id) AS cnt, SUM(ff.order) AS rank FROM
`favourite_film` AS ff GROUP BY ff.film_id ORDER BY cnt DESC, rank ASC
我想我需要表中所有电影的数量和顺序的总和(但是相反?),我的理论就会变平了!
非常感谢任何帮助或链接。感谢。
答案 0 :(得分:0)
你应该在保存之前恢复列表。这样你就可以将未经选择的电影从评级中删除。
解决方法可能是:
计算列表的数量SELECT COUNT(DISTINCT(user_id)
,将其另存为$AMOUNT_OF_LISTS
现在使用
计算点数SELECT film_id, (SUM(order)+($AMOUNT_OF_LISTS-COUNT(DISTINCT(user_id)))*POINTS_FOR_NOT_IN_LIST) as points FROM table GROUP BY film_id
逻辑:总结所有点并在每次不在列表中添加POINTS_FOR_NOT_IN_LIST
点(列表总数 - 电影在列表中的次数)
根据您的喜好插入值POINTS_FOR_NOT_IN_LIST
。 (可能是26或27甚至更低)
您可能希望在查询中添加ORDER BY points DESC LIMIT 10
以获得10个最高分
答案 1 :(得分:0)
SELECT MIN( `order` ) , COUNT( * ) AS cnt, `film_id`
FROM `favourite_film`
GROUP BY `film_id`
ORDER BY cnt DESC , `order`
答案 2 :(得分:0)
我会这样做,我会为排名更高的电影分配更高的价值。然后我会将每部电影的价值和总数下降的总和相加得到整体排名。这样你就可以减轻每部电影的受欢迎程度和排名。
因此,如果您想通过每位用户排名前3位的电影来实现这一目标,那么您可以这样做:
SELECT film_id, SUM(3 -- The max number of ranked movies per user
- order -- the ranking
+ 1) total_score
FROM TABLE_NAME
GROUP BY film_id
ORDER BY total_score DESC;
显然你可以删除评论
通过这种方式,评分最高的电影将获得更高的分数,下一个最高分,下一个最高分,等等。如果您计算每个用户的前10部电影,只需将3更改为10。
答案 3 :(得分:0)
根据您的“业务规则”,我认为您应该找到某种计算方式,同时考虑位置和“投票数”。
只是随机猜测,但为什么不按COUNT(votes)/AVG(pos)
排序?出于可维护性原因,您可能希望将排名功能分解出来:
CREATE FUNCTION ranking(average_pos REAL, vote_count INT)
RETURNS REAL
DETERMINISTIC
RETURN vote_count/average_pos;
查询现在只是:
SELECT film_id,
AVG(pos) as a, COUNT(*) as c, ranking(AVG(pos),COUNT(*)) AS rank
FROM vote GROUP BY film_id
ORDER BY ranking(AVG(pos), COUNT(*)) DESC;
使用您的示例制作:
+----------+------+----+----------------+
| FILM_ID | A | C | RANK |
+----------+------+----+----------------+
| 7 | 1.5 | 2 | 1.333333333333 |
| 6 | 1 | 1 | 1 |
| 8 | 2 | 1 | 0.5 |
| 5 | 3 | 1 | 0.333333333333 |
| 4 | 3 | 1 | 0.333333333333 |
+----------+------+----+----------------+