Mysql按用户排序的项目获得整体订单

时间:2013-08-16 12:59:09

标签: php mysql jquery-ui

我有一个电影列表,用户可以使用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

我想我需要表中所有电影的数量和顺序的总和(但是相反?),我的理论就会变平了!

非常感谢任何帮助或链接。感谢。

4 个答案:

答案 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 |
+----------+------+----+----------------+

请参阅http://sqlfiddle.com/#!2/3b1d9/1