Я использую предложение от Даниэля Вассалло Вот оценивать записи в моей таблице MySQL.
Предложение не касается связей, поэтому я хочу, чтобы более новая запись не получала более высокого ранга, чем более старая запись с таким же счетом на моем табло, и это работает для моих нужд.
Моя проблема в том, что я хочу использовать этот тип рейтинга, чтобы получить рейтинг для одного пользователя. Поэтому из результатов этого запроса я хотел бы определить имя, чтобы скрипт возвращал рейтинг, имя и оценку только этого пользователя.
Я перепробовал множество различных методов, и, поскольку некоторые из них имеют дело со связями, результаты для одного пользователя в конечном итоге отличаются от результатов, представленных в приведенном ниже коде.
Ваша помощь будет принята с благодарностью …. седеть по этому поводу!
это мой текущий код:
в настоящее время выводит:
оценка звания
ты 1110
<?php
include("common.php");
$link=dbConnect();
$limit = safe($_POST['limit']);
$query = "SELECT name, score, @curRank := @curRank + 1 AS rank
FROM $dbName . `scores`, (
SELECT @curRank := 0
) q
ORDER BY score DESC LIMIT $limit";
$result = mysql_query($query);
$my_err = mysql_error();
if($result === false || $my_err != '')
{
echo "";
}
$num_results = mysql_num_rows($result);
for($i = 0; $i < $num_results; $i++)
{
$row = mysql_fetch_array($result);
echo $row[rank] . " ". $row['name'] . " - " . $row['score'] . "\n";
}
?>
ОБНОВИТЬ
Уточнить на связи; исходный сценарий всегда будет увеличиваться независимо от связей, так я и хочу, потому что я этого не хочу, поэтому связи ранжируются одинаково (нет общих мест), и так получилось, что сценарий предпочтет первого человека, достигшего забить так, что новый игрок не может выбить его / ее с первой строчки с одинаковым счетом, они должны побить его.
Я знаю, что это устарело, как я видел во многих подобных постах, но я просто пытаюсь построить скелет, прежде чем добавить мясо в кости.
Как любезно предложено Spencer7593, я попробовал следующий код без особой удачи.
<?php
include("common.php");
$link=dbConnect();
$limit = safe($_POST['limit']);
$query = "SELECT name, score, @curRank := @curRank + 1 AS rank
FROM $dbName . `scores`, (
SELECT @curRank := 0
) q
ORDER BY score DESC LIMIT $limit";
$result = mysql_query($query);
$my_err = mysql_error();
if($result === false || $my_err != '')
{
echo "";
}
$num_results = mysql_num_rows($result);
while ($row = $result->fetch_assoc()) {
if ( $row['rank'] == 'you' )
{
// output this row because it's for the specified user
echo $row['name'];
}
else
{
continue;
}
}
?>
Чтобы получить ранжирование для одного пользователя, извлеченного из результатов запроса, вы можете просмотреть результаты в PHP, как и вы, но «пропустить» вывод строк, которые не предназначены для указанного пользователя.
Там нет необходимости для for ($i=0;i<
петля. Используйте цикл «while fetch». (Я не хочу приводить вам пример кода с использованием устаревшего интерфейса mysql; новая разработка должна использовать либо mysqli, либо PDO.)
while ($row = $result->fetch_assoc()) {
if ( $row['name'] == 'you' ) {
// output this row because it's for the specified user
echo $row['rank'];
} else {
// skip this row
}
}
Вы шумите над обработкой «связей», но что не ясно, что вы на самом деле хотите получить в качестве вывода. Если вы хотите строки, которые имеют одинаковое значение для «score
«имеют одинаковое значение для rank
Просто обработайте это в своем запросе. Если оценка в текущей строке совпадает с оценкой в предыдущей строке, не увеличивайте ранг. например
SELECT @curRank := IF(s.score=@prev,@curRank,@curRank + 1) AS rank
, s.name
, @prev := s.score AS score
FROM $dbName . `scores` s
CROSS
JOIN (SELECT @curRank := 0, @prev := NULL) q
ORDER BY s.score DESC
LIMIT $limit
Включение потенциально небезопасных значений в текст SQL приводит к уязвимостям SQL-инъекций; мы будем предполагать, что вы гарантировали значения $dbName
а также $limit
являются безопасный.
Если вы хотите, чтобы запрос отфильтровывал строки для определенного name
затем оберните этот запрос в скобки и укажите его как встроенное представление, например,
SELECT v.rank
, v.name
, v.score
FROM ( SELECT @curRank := IF(s.score=@prev,@curRank,@curRank + 1) AS rank
, s.name
, @prev := s.score AS score
FROM $dbName . `scores` s
CROSS
JOIN (SELECT @curRank := 0, @prev := NULL) q
ORDER BY s.score DESC
LIMIT $limit
) v
WHERE v.name = 'you'
ORDER BY v.rank ASC
Других решений пока нет …