2013-11-01 1 views
2

У меня есть таблица users с колонкой points. Пользователь id не является автоинкрементным, но это идентификатор пользователя из Twitter.Выбирайте строки до и после сопоставления строк в указанном порядке

Я пытаюсь выбрать пользователя по username (так всегда 1 пользователь) и выбрать 10 строк перед ним и 10 строк после него.

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

Я использую Laravel 4 и Eloquent, но я уверен, что это не может быть сделано с Красноречивым.

+-----------+--------------+------------+ 
| id  | username  | vote_count | 
+-----------+--------------+------------+ 
| 123456789 | user1  |  150 | 
| 123456789 | user2  |  101 | 
| 123456789 | user3  |   90 | 
| 123456789 | user4  |   88 | 
| 123456789 | user5  |   70 | 
| 123456789 | user6  |   67 | 
| 123456789 | user7  |   65 | 
| 123456789 | user8  |   55 | 
| 123456789 | user9  |   54 | 
| 123456789 | user10  |   45 | 
| 123456789 | user11  |   44 | 
| 123456789 | user12  |   42 | 
+-----------+--------------+------------+ 

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

Надежда я быть ясно с этим один

+0

* выберите 10 строк перед ним и 10 строк после него * Что это значит? Можете ли вы показать пример данных? –

+0

Я отредактировал вопрос –

ответ

1

Что-то вроде этого:

SQLFiddle demo

select * from 

(
select * from 
(
select * from t where vote_count<= 
         (select vote_count 
         from t 
         where username ='user5') 

ORDER BY vote_count desc 
LIMIT 3 
) as T1 
UNION 
select * from 
(
select * from t where vote_count> 
         (select vote_count 
         from t 
         where username ='user5') 

ORDER BY vote_count ASC 
LIMIT 2 
) as T2 
) as T3 ORDER BY VOTE_COUNT DESC 
+0

Это, кажется, работает нормально. Можно ли отслеживать индекс строки? –

0

Вы можете использовать union

(SELECT id, vote_count 
FROM `table` 
WHERE id > 123456789 
LIMIT 10) 
UNION 
(SELECT id, vote_count 
FROM `table` 
WHERE id <= 123456789 
LIMIT 10) 
ORDER BY vote_count 
-1

Вы можете проверить SQL FIDDLE
select * from ((select A.vote_count,A.username from t A join t B on A.vote_count<B.vote_count where B.username='user5' order by A.vote_count DESC limit 2) UNION (select A.vote_count,A.username from t A join t B on A.vote_count>=B.vote_count where B.username='user5' order by A.vote_count limit 3)) as T order by vote_count desc

Смежные вопросы