计算多个数据库列中的“最受欢迎”ID

时间:2012-02-12 00:36:12

标签: php sql codeigniter

在我的网站上(针对PS3游戏玩家),用户可以选择他们当前正在玩的3款游戏。然后我将确定哪些游戏最受欢迎,并根据活跃用户列出前5名。

我的用户表中有3列名为game1_id,game2_id和game3_id。这些值与另一个名为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();
    }
}

我认为我需要以某种方式计算在三个列中的任何一个(game1_id,game2_id,game3_id)中找到游戏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();

    }

}

2 个答案:

答案 0 :(得分:1)

我认为更好的设计是将user_id与game_id相关联的多对多表格,从而使每个用户都有三行用于他们喜欢的游戏。

答案 1 :(得分:1)

不使用3列,而是使用单独的表格为每个用户存储喜爱的游戏。然后你可以使用如下的简单查询来获得前5个游戏:

SELECT game_id, count( * ) as popularity
FROM users_favorite_games
GROUP BY game_id
ORDER BY popularity DESC
LIMIT 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;

然而,问题中的示例显示您正在使用CodeIgniter的ActiveRecord,does not support UNION。所以你最终会得到一个更复杂的查询和一些额外的黑客攻击方法。不完全是理想的。