Я пытаюсь получить единый рейтинг для пользователя для каждого статистического «столбца» в таблице. Я пытаюсь сделать это как можно более эффективно, потому что я знаю, что вы можете.
Итак, у меня есть таблица с именем userstats. в этой таблице у меня есть 3 столбца user_id, stat_1, stat_2 и stat_3. Я хочу, чтобы у меня была возможность получить ранг для каждой характеристики соответствующего user_id. с моим текущим кодом ниже, я должен буду продублировать код 3x и изменить имена столбцов, чтобы получить мой результат. пожалуйста, посмотрите на примеры ниже. Спасибо!
вот как я сейчас получаю звание для пользователей
$ rankstat1 = getUserRank ($ userid);
<code>
function getUserRank($userid){
$sql = "SELECT * FROM ".DB_USERSTATS." ORDER BY stat_1 DESC";
$result = mysql_query($sql);
$rows = '';
$data = array();
if (!empty($result))
$rows = mysql_num_rows($result);
else
$rows = '';
if (!empty($rows)){
while ($rows = mysql_fetch_assoc($result)){
$data[] = $rows;
}
}
$rank = 1;
foreach($data as $item){
if ($item['user_id'] == $userid){
return $rank;
}
++$rank;
}
return 1;
}
</code>
Я верю, что есть способ получить то, что мне нужно, с чем-то вроде этого, но я не могу заставить его работать.
$ rankstat1 = getUserRank ($ userid, ‘stat_1’); $ rankstat2 =
getUserRank ($ userid, ‘stat_2’); $ rankstat3 = getUserRank ($ userid,
‘Stat_3’);
Вы можете получить все ранги статистики, используя один запрос, не выполняя все циклы и проверку PHP.
Я использовал PDO в этом примере, потому что значение $userid
переменная должна использоваться в запросе, а устаревший mysql
Расширение базы данных не поддерживает подготовленные операторы, которые следует использовать для снижения риска внедрения SQL.
Функция может быть адаптирована для использования того же запроса с mysqli
, или даже mysql
если вы должны использовать это.
function getUserRanks($userid, $pdo) {
$sql = "SELECT
COUNT(DISTINCT s1.user_id) + 1 AS stat_1_rank,
COUNT(DISTINCT s2.user_id) + 1 AS stat_2_rank,
COUNT(DISTINCT s3.user_id) + 1 AS stat_3_rank
FROM user_stats f
LEFT JOIN user_stats s1 ON f.stat_1 < s1.stat_1
LEFT JOIN user_stats s2 ON f.stat_2 < s2.stat_2
LEFT JOIN user_stats s3 ON f.stat_3 < s3.stat_3
WHERE f.user_id = ?"
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, $userid);
$stmt->execute();
$ranks = $stmt->fetchObject();
return $ranks;
}
Это должно вернуть объект со свойствами, содержащими ранги данного пользователя для каждой статистики. Пример использования этой функции:
$pdo = new PDO($dsn, $user, $pw);
$ranks = getUserRanks(3, $pdo); // get the stat ranks for user 3
echo $ranks->stat_2_rank; // show user 3's rank for stat 2
$sql = "SELECT user_id, stat_1, stat_2, stat_3 FROM ".DB_USERSTATS." ORDER BY stat_1 DESC";
Кроме того, если нет причин, по которым вам нужны результаты ВСЕХ пользователей, ограничьте свой запрос предложением WHERE, чтобы вы получали только те результаты, которые вам действительно нужны.
Предполагая, что вы ограничите свой SQL-запрос только одним пользователем, вы получите статистику этого пользователя.
foreach($data as $item){
$stat_1 = $item['stat_1'];
$stat_2 = $item['stat_2'];
$stat_3 = $item['stat_3'];
}
Если вы получили статистику более чем одного пользователя с помощью вашего SQL-запроса, рассмотрите возможность передачи массива $ data обратно в вызывающую функцию и выполните цикл по массиву, чтобы сопоставить статистику пользователя с определенным идентификатором пользователя.