Вывод продвинутого рейтинга

226
05 февраля 2018, 05:57

Есть таблица MySQL(users), там данные - id, name, points. Мне нужно получить 3 строчки: 1 человек, который по баллам больше, я и 1 человек, который по баллам меньше. Прошу помощи, как это сделать?

Answer 1

А запрос в MySQL оказался довольно не тривиальным:

select U.*
  from tab_users U
  join (
    select counter,id from tab_users
     where counter >= (select counter from tab_users where id=@my_id)
     order by (id=@my_id), counter limit 1
  ) P
    on     U.counter < P.counter
       or (U.counter >= P.counter and U.id in(P.id, @my_id))
 order by (U.id!=P.id), U.counter desc
 limit 3

Подзапрос P получает рейтинг и id записи у которой рейтинг больше, либо такой же как у основной записи ("Я"). При этом, если записей с таким же рейтингом, как у основной несколько, берется любая из них, кроме основной. Если записей с большим или таким же рейтингом найдено не будет, то возьмется основная запись.

После этого к подзапросу подбираются все записи с меньшим либо равным рейтингом. Причем если рейтинг равен, то надо брать строго одну запись с id, найденном в подзапросе P либо основную. Записи сортируются так, что бы запись из подзапроса P обязательно оказалась первой.

При таком подходе основная запись оказывается в середине. В случае если рейтинг основной записи максимален ("Я top 1") получим так же 3 записи, при этом основная запись будет первой. В случае же, если основная запись в самом низу рейтинга, то запрос выдает всего 2 записи - предыдущую и основную (если этот момент не устраивает, надо еще поработать с условиями подзапроса P что бы получить еще резервную запись, для такого случая).

Пример на sqlfiddle.com

Вариант 2: пронумеровать все записи и найти нужные по номерам:

select *
  from (
   select *, @n:=@n+1 num, @my_num:=if(id=@my_id,@n,@my_num)
     from tab_users, (select @n:=0, @my_num:=0) x
    order by counter
  ) X
  where num between @my_num-1 and @my_num+1
Answer 2

Сделал очень криво, но работает.

$qr_result = mysql_query("SELECT `id`, `name`, `counter` FROM `users` WHERE `job` = 0 ORDER BY `counter` DESC");
                    echo '<h3>Позиция</h3>';
                    echo '<table border="1" class="table" id="utable">';
                    echo '<thead>';
                    echo '<tr>';
                    echo '<th>№</th>';
                    echo '<th>Ф.И.О.</th>';
                    echo '<th>Баллы</th>';
                    echo '</tr>';
                    echo '</thead>';
                    echo '<tbody>';
                    $i=0;
                    $iidata = Array();
                    while($idata = mysql_fetch_array($qr_result)){
                        array_push($iidata, $idata);
                    }
                    foreach($iidata as $val){
                        if($val['id']==$data['id']){
                          if($i-1<0){
                          echo '<tr id="active">';
                          echo '<td>' . ($i+1) . '</td>';
                          echo '<td>' . $val['name'] . '</td>';
                          echo '<td>' . $val['counter'] . '</td>';
                          echo '</tr>';
                          echo '<tr>';
                          echo '<td>' . ($i+2) . '</td>';
                          echo '<td>' . $iidata[$i+1]['name'] . '</td>';
                          echo '<td>' . $iidata[$i+1]['counter'] . '</td>';
                          echo '</tr>';
                          echo '<tr>';
                          echo '<td>' . ($i+3) . '</td>';
                          echo '<td>' . $iidata[$i+2]['name'] . '</td>';
                          echo '<td>' . $iidata[$i+2]['counter'] . '</td>';
                          echo '</tr>';
                          }else{
                          echo '<tr>';
                          echo '<td>' . ($i) . '</td>';
                          echo '<td>' . $iidata[$i-1]['name'] . '</td>';
                          echo '<td>' . $iidata[$i-1]['counter'] . '</td>';
                          echo '</tr>';
                          echo '<tr id="active">';
                          echo '<td>' . ($i+1) . '</td>';
                          echo '<td>' . $val['name'] . '</td>';
                          echo '<td>' . $val['counter'] . '</td>';
                          echo '</tr>';
                          echo '<tr>';
                          echo '<td>' . ($i+2) . '</td>';
                          echo '<td>' . $iidata[$i+1]['name'] . '</td>';
                          echo '<td>' . $iidata[$i+1]['counter'] . '</td>';
                          echo '</tr>';
                          }
                        }
                        $i++;

Спасибо, кто хотел помочь!

READ ALSO
сбор данных с другого сайта

сбор данных с другого сайта

Есть вот такой код на php и js:

159
В чем проблема заключается?

В чем проблема заключается?

В настройках webmoney лежит как показано на скриншоте

171
Как сделать тест Срупе через js

Как сделать тест Срупе через js

Как сделать тест Струпе? То есть мне нужно чтобы выводилось какое то рандомное слово из ограниченного списка рандомного цвета шрифтаНиже...

146
Перегрузка метода в Google Test

Перегрузка метода в Google Test

В моём TestMock классе у меня есть два метода:

208