MySQL рейтинг для одного пользователя

Я использую предложение от Даниэля Вассалло Вот оценивать записи в моей таблице MySQL.

Предложение не касается связей, поэтому я хочу, чтобы более новая запись не получала более высокого ранга, чем более старая запись с таким же счетом на моем табло, и это работает для моих нужд.

Моя проблема в том, что я хочу использовать этот тип рейтинга, чтобы получить рейтинг для одного пользователя. Поэтому из результатов этого запроса я хотел бы определить имя, чтобы скрипт возвращал рейтинг, имя и оценку только этого пользователя.

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

Ваша помощь будет принята с благодарностью …. седеть по этому поводу!

это мой текущий код:

в настоящее время выводит:

оценка звания

  1. мне 1111
  2. мне 1111
  3. ты 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;
}
}
?>

-1

Решение

Чтобы получить ранжирование для одного пользователя, извлеченного из результатов запроса, вы можете просмотреть результаты в 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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]