在我的网站上(针对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();
}
}
答案 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。所以你最终会得到一个更复杂的查询和一些额外的黑客攻击方法。不完全是理想的。