2012-01-24 12 views
3

そこにはいくつかのランクポストがありますが、結果がページングされたときと、ランク付け基準(この場合はポイント)が前のユーザーと等しい場合は、 。私はいくつかの既存の例を試しましたが、どれも成功していませんでした。ページネーションとの合計に基づいてユーザーランクを取得

私は、カラム "id"を持つ "users"というテーブルを持っています。私はまた、 "user_id"と "量"の列を持つ "ポイント"と呼ばれるテーブルを持っています。

は私が必要:

1)ポイントの重複合計を持つユーザーは、同じランクを持つように

ポイント表

user_id  amount 
    1   10 
    2   20 
    1   5 
    3   20 
    3   -5 
    4   5 

ランクがあるべき

rank  user_id total 
1   2  20 
2   1  15 
2   3  15 
3   4  5 

2.)1つのPAから順位を維持する必要があるクエリーでランクが集められ、結果のPHPでは収集されないようにする必要があります。

3.)ポイントテーブルに行があるユーザーだけでなく、すべてのユーザーを表示するユーザーがあり、最後に表示したいユーザーもいるためです。

今は自分のポイント順にユーザーをリストアップしていますが、ランク付けされていないのはランク付けされていないためです。

$getfanspoints = mysql_query("SELECT DISTINCT id, 
(SELECT SUM(amount) AS points FROM points WHERE points.user_id = users.id) AS points 
FROM users 
ORDER BY points DESC LIMIT $offset, $fans_limit", $conn); 

私はこれらのソリューションを読んだことがあります。

[ローランドのブログ] [1]

[SUMさんに基づいてランクを取得する方法] [2]

[MySQLは、ユーザーがランク取得] [3]

[ランクを取得する方法mysqlクエリを使用して] [4]

と私は今すぐ見つけることができないいくつかの他の人。

[EDIT]

私はypercubeの下の答えを使用していました。

+0

ただ、サイドノート:あなたは、あなたがそれらを変更するよりも多くのランクを表示した場合、それはユーザーテーブル内のすべてのユーザーのためのポイントの合計を、あなたのテーブルを非正規化して保存を考える価値があるだろう。ユーザーがいくつかのポイントを取得した場合にのみ、ページのレンダリングごとにポイントを再計算するのではなく、ポイントを更新します。私はそれがユーザーとしての私のような状況で行うことは困難になると思う – bububaba

+0

を獲得し、急速にポイントを失うが、ポイントは一種の「キュー内」もあり、彼らは実際のもののために彼らのポイントを使用することができたときにポイントが報わとされたときの間の遅延があります。また、それぞれのポイントは特定のアクションに結びついています。 pointsテーブルには、column page_id、module_id、post_id、group_id、item_id、other_usersも含まれます。彼らはさまざまな活動のポイントを獲得して失い、そのログは自分のプロフィールとユーザーダッシュボードに表示されます。説明するのは難しいですが、私はそれがうまくいくとは感じません。 – bowlerae

答えて

1
SELECT COUNT(*) AS rank 
    , t.user_id 
    , t.total 
FROM 
     (SELECT user_id 
      , SUM(amount) AS total 
     FROM  points 
     GROUP BY user_id 
    ) AS t 
    JOIN 
     (SELECT DISTINCT 
       SUM(amount) AS total 
     FROM  points 
     GROUP BY user_id 
    ) AS dt 
    ON 
     t.total <= dt.total 
GROUP BY t.user_id 
ORDER BY rank 
     , user_id 

しかし、上記のことが多い授与大きなテーブルとの点で本当に遅くなることがあります。

SELECT users.id AS user_id 
    , SUM(amount) AS total 
FROM  
     users 
    LEFT JOIN 
     points 
    ON points.user_id = users.id 
GROUP BY users.id 
ORDER BY total DESC 
     , user_id 

これは(usersテーブルとし、OFFSETで動作するように、編集した)あまりにも、動作します:

ちょうど、これを持っており、アプリケーションコードでランクを計算するために本当に良いかもしれません
SELECT * 
FROM 
    (SELECT 
      @rank := @rank + (@t <> total) AS rank 
     , user_id 
     , @t := total AS total 
    FROM 
     (SELECT users.id AS user_id 
       , COALESCE(SUM(amount),0) AS total 
      FROM users 
      LEFT JOIN points 
       ON users.id = points.user_id 
      GROUP BY users.id 
     ) AS o 
     CROSS JOIN 
     (SELECT @rank := 0, @t := -999999 
     ) AS dummy 
    ORDER BY total DESC 
      , user_id 
) tmp 
LIMIT x OFFSET y 
+0

いずれのソリューションも動作しません。エラーメッセージは0の結果しか返しません。なぜポイントからではなく、合計FROMユーザーのSUM(金額)を選択するのでしょうか? – bowlerae

+0

はい、それは 'points'からのものでなければなりません。 –

+0

それは働いていませんでした:(私は、私はちょうどそれを得てのかもしれないと思う。上記を確認してください。 – bowlerae

関連する問題