Рассчитать «самые популярные» идентификаторы в нескольких столбцах базы данных - PullRequest
1 голос
/ 12 февраля 2012

На моем сайте (ориентированном на геймеров 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), но я не совсем уверен, как это сделать?

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

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 ]

1 голос
/ 12 февраля 2012

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

1 голос
/ 12 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...