Как выбрать строку по первичному ключу, одну строку «над» и одну строку «под» другим столбцом? - PullRequest
2 голосов
/ 27 апреля 2011

Хорошо, у меня есть таблица «users» со столбцом «id» и столбцом «Score».«id» является первичным ключом, «score» может быть любым положительным целым числом, и пользователи могут иметь одинаковые оценки.

Мне нужно выбрать 3 строки:

  • «целевой пользователь», то есть одна строка с «id»
  • Пользователь, находящийся непосредственно над целевым пользователем, когдатаблица упорядочена по «Score»
  • Пользователь, находящийся непосредственно под целевым пользователем, когда таблица упорядочена по «Score»

Есть предложения о том, как это сделать в SQL?Спасибо!

ОБНОВЛЕНИЕ

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

Пример данных:

id  score  
1   0  
2   5  
3   9  
4   5  
5   5  *
6   5  
7   8  *  
8   3  *

Итак, если у моего целевого пользователя id = 5, я хочу строки с идентификаторами 7, 5 и 8

Ответы [ 5 ]

2 голосов
/ 27 апреля 2011

Сначала запросите оценку для этого конкретного пользователя:

select  score
from    users
where   id = 42

Скажите, что оценка для пользователя 42 равна 6. Затем можно запросить следующего пользователя, например:

select  name
,       score
from    users
where   score > 6
order by
        score
limit   1

ипредыдущий пользователь, как:

select  name
,       score
from    users
where   score < 6
order by
        score desc
limit   1
1 голос
/ 27 апреля 2011
set @ID = 3;

set @Score = (select score
              from users
              where ID = @ID);

select ID, Score
from (select U.ID, U.Score
      from users as U
      where U.ID <> @ID and
            U.Score < @Score
      order by U.Score desc limit 1) as P
union all
select U.ID, U.Score
from users U
where U.ID = @ID
union all
select *
from (select U.ID, U.Score
      from users as U
      where U.ID <> @ID and
            U.Score > @Score
      order by U.Score limit 1) as A
order by Score;        
0 голосов
/ 27 апреля 2011

Поскольку мне нужно форматирование для обсуждения предложения Андомара:

Учитывая, что у некоторых пользователей одинаковый балл (6):

mysql> select * from sam1vp;
+------+-------+
| user | score |
+------+-------+
|   40 |     5 |
|   41 |     6 |
|   42 |     6 |
|   43 |     6 |
|   44 |     7 |
+------+-------+

Запрос с > / < не вернетсяближайшие соседи:

mysql> select user,score from sam1vp where score > 6 order by score limit 1;
+------+-------+
| user | score |
+------+-------+
|   44 |     7 |
+------+-------+

Использование >= / <= без учета целевого пользователя:

mysql> select user,score from sam1vp where score >= 6 and user != 42 order by score limit 1;
+------+-------+
| user | score |
+------+-------+
|   41 |     6 |
+------+-------+
0 голосов
/ 27 апреля 2011
select name, score
from users
where id >= select id 
            from users 
            where id < 42 
            order score 
            limit 1
order by score
limit 3
0 голосов
/ 27 апреля 2011

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

Вы можете рассмотреть подзапрос.Внутренний запрос будет выглядеть примерно так:

select score from users where last='Who' and first='Doctor'

. Для внешнего запроса вы получите следующий запрос:

select * from users 
  where score >= (select score from users where last='Who' and first='Doctor')
  order by score asc
  limit 1

. Я оставлю пользователя непосредственно ниже в качестве упражнения дляОП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...