Есть таблица MySQL(users), там данные - id, name, points. Мне нужно получить 3 строчки: 1 человек, который по баллам больше, я и 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
Сделал очень криво, но работает.
$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++;
Спасибо, кто хотел помочь!
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как сделать тест Струпе? То есть мне нужно чтобы выводилось какое то рандомное слово из ограниченного списка рандомного цвета шрифтаНиже...