2012-02-12 17 views
1

私のサイト(PS3のゲーマー向け)では、ユーザーは現在プレイしている3つのゲームを選択できます。私はどのゲームが最も人気があるかを考え、アクティブなユーザーに基づいてトップ5を挙げます。複数のデータベース列で「最も一般的な」IDを計算する

ユーザーテーブルにgame1_id、game2_id、game3_idという3つの列があります。これらの値は、gameという別のテーブルのidカラムと関係しています。このテーブルには、タイトルなどのゲームに関するすべての情報が入っています。

これらの合計を集計し、上位5つの最もアクティブなゲームを返す方法を教えてください。ここで

は、これまでの私のモデル関数である:

function get_5_popular_games() 
{ 
    $this->db->select('user.game1_id, user.game2_id, user.game3_id'); 
    $this->db->from('user'); 
    $query = $this->db->get(); 

    if ($query->num_rows() > 0) 
    { 
     return $query->result(); 
    } 
} 

私は何とかゲームIDが3つの列(game1_id、game2_id、game3_id)のいずれかで発見された回数まで集計する必要があると仮定したが、私はそれについてどうやって行くのか完全にはわからないのですか?

[編集]ここに完成した機能があります。

function get_popular_games($limit) 

{ 

    $this->db->select('count(*) as popularity, game.title'); 
    $this->db->from('user_game'); 
    $this->db->join('game', 'game.id = user_game.game_id'); 
    $this->db->group_by('game_id'); 
    $this->db->order_by('popularity', 'desc'); 
    $this->db->limit($limit); 
    $query = $this->db->get(); 

    if ($query->num_rows() > 0) 

    { 

     return $query->result(); 

    } 

} 
+0

それはあなたのために働く場合、受け入れられた答えを投票してください。 –

答えて

1

3つの列を持つ代わりに、別のテーブルを使用して、各ユーザーのお気に入りのゲームを格納します。

SELECT game_id, count(*) as popularity 
FROM users_favorite_games 
GROUP BY game_id 
ORDER BY popularity DESC 
LIMIT 5; 

編集
誰かがそうもう少しコンテキストは順序であってもよく、この答えを好きではなかった...

:次に、あなたがトップ5のゲームを取得するには、次のような単純なクエリを使用することができます

スキーマを変更せずに、必要な操作を行うことができます。あなたのクエリは、次のようになります。

SELECT game_id, count(game_id) AS Popularity 
FROM (
    SELECT id, game1_id AS game_id 
    FROM user 
    UNION SELECT id, game2_id 
    FROM user 
    UNION SELECT id, game3_id 
    FROM user 
    ) AS user_games 
GROUP BY game_id 
ORDER BY Popularity DESC; 

をしかし、問題の例では、does not support UNION CodeIgniterのActiveRecordのを、使用していることを示しています。だから、あなたはより複雑なクエリといくつかの追加のハッキングをあなたのメソッドで終わらせるでしょう。正確には望ましくない。

+0

パーフェクト。私は今OPを編集し、ソリューション機能を追加します。ありがとう! – Prefontaine

1

私はより良いデザインは自分の好きなゲームのための3つの列を有する各ユーザーで、その結果、game_idでのuser_idを関連付ける多対多のテーブルを持っているだろうと思います。

+0

うん、良い考え。私は今データベースを再設計し、そのようにします。 – Prefontaine

+1

これは質問された質問に対する回答ではなく、1つとして投稿されるべきではありません。代わりに元の質問にコメントとして含まれています。 (相違点がわからない場合は、[FAQ](http://stackoverflow.com/faq)を参照して、何が答えを構成するのか説明してください。 –

関連する問題