2012-02-12 1 views
1

На моем сайте (предназначенном для игроков PS3) пользователи могут выбрать 3 игры, которые они сейчас играют. Я потом выясню, какие игры являются самыми популярными, и список лучших 5 на основе активных пользователей.Вычислить «самые популярные» идентификаторы в нескольких столбцах базы данных

У меня есть 3 колонки в моей таблице пользователей, которые называются game1_id, game2_id и game3_id. Эти значения относятся к столбцу 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), но Я не совсем уверен, как это сделать?

[EDIT] И ЗДЕСЬ ЗАВЕРШЕННАЯ ФУНКЦИЯ.

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

Вместо трех столбцов используйте отдельную таблицу для хранения любимых игр для каждого пользователя. Тогда вы могли бы использовать простой запрос, как следующий, чтобы получить лучшие 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; 

Однако пример в этом вопросе показывает, что вы используете ActiveRecord CodeIgniter своему, does not support UNION. Таким образом, у вас будет более сложный запрос и дополнительный хакинг в вашем методе. Не совсем желательно.

+0

Отлично работает. Теперь я отредактирую свой OP и включу функцию решения. Спасибо! – Prefontaine

1

Я думаю, что лучше дизайн будет иметь много-ко-многим таблицы, связывающей user_id с game_id, в результате чего каждого пользователя, имеющих три ряда для своих любимых игр.

+0

Да, хорошее мышление. Теперь я переконструирую мою базу данных и сделаю так. – Prefontaine

+1

Это не ответ на заданный вопрос и не должен быть размещен как один. Вместо этого он принадлежит как комментарий к исходному вопросу. (Если вы не знаете, в чем разница, см. [FAQ] (http://stackoverflow.com/faq) для объяснения того, что делает (и не делает) ответ. –

Смежные вопросы