1

ユーザーがサイト上の特定のアクションでアチーブメントを獲得するシステムを作成しています。

データベースは、ユーザー、実績、および 2 つをリンクするテーブルの 3 つに分かれています。

ランキングで重要なのは、ユーザーと実績をリンクするテーブルです。このように構造化されています (user_achievements と呼ばれます):

| id | user_id | achievement_id | created_at | updated_at |

一番上のランキングには、最も多くの成果を上げ、最初にそれを獲得した人が必要です。

組み立てられたクエリ:

SELECT user_id, 
       COUNT(achievement_id) AS 'total', 
       created_at 
FROM `user_achievements` 
GROUP BY user_id ORDER BY total DESC, created_at ASC LIMIT 10

このクエリは機能しますが、問題は誰が最も多くの実績を持っているか (「合計」) の「グループ化」であり、最後の created_at ユーザーをバックアップしません。最初の created_at そのユーザーに来てください。これは、その量の実績を最初に獲得した人には当てはまりません。

私のシステムは Ruby on Rails を使用しています。ActiveRecord でこのクエリの解決策はありますか?非常に役に立ちます。

どうもありがとう!私の英語でごめんなさい...

4

2 に答える 2

3
SELECT user_id, 
       COUNT(achievement_id) AS 'total', 
       MAX(created_at) as 'lastTS' 
FROM `user_achievements` 
GROUP BY user_id 
ORDER BY total DESC, lastTS ASC LIMIT 10
于 2012-08-25T03:07:09.750 に答える
1

あなたがあなたの答えを選択したことは知っていますが、それでもActiveRecordで解決策が必要な場合は...

class User < ActiveRecord::Base
    scope :ranked, order('achievements.count DESC, achievements.created_at ASC').limit(10)
end

そして、あなたはただ電話をするUsers.ranked@users.ranked、あなたが必要とするリターンを得る必要があります。

于 2012-08-26T02:38:13.073 に答える