0

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

私が欲しいのは、全体的な「トップ 10」スタイル リストです。つまり、フィルム 7 が最も人気があります。なぜなら、人々 のリストの上位に表示され、より多くのリストに含まれているからです。フィルム 6 が最も人気があるかもしれませんが、リストは 1 つだけですか?!

私はそれを行うためにロジックと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

4 に答える 4

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を参照してください

于 2013-08-16T13:25:17.643 に答える
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 1010 点の最高点を取得するためにクエリに追加することをお勧めします。

于 2013-08-16T13:11:27.870 に答える
0
SELECT MIN(  `order` ) , COUNT( * ) AS cnt,  `film_id` 
FROM  `favourite_film` 
GROUP BY  `film_id` 
ORDER BY cnt DESC ,  `order` 
于 2013-08-16T13:19:01.680 に答える
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 に変更するだけです。

于 2013-08-16T13:19:04.483 に答える