2016-08-15 2 views
2

Итак, у меня есть таблица student_profiles и таблица рангов, я хочу получить следующий ранг на основе ранга ученика. Например, у меня есть ранг 5, тогда следующий ранг будет ранг 6. Так что это моя ранговая структура.MySQL - Как получить следующую строку

ЗВАНИЯ ТАБЛИЦА: SELECT * FROM RANKS WHERE style_id = 1"

id style_id level name type primary_colour secondary_colour 
1  1  1 Newbie double #4e90b2  #3aad04 
22  1  2 Normal solid #fba729  NULL 
31  1  3 Expert solid #4e805b  NULL 

и это STUDENT_PROFILES ТАБЛИЦА

id | student_id | rank_id 
------------------------------------ 
    1 |  1  | 36 
    2 |  4  | 22 
    3 |  7  | 10 

так что все у меня есть переменная student_id, rank_id & style_id

так, например, у меня есть это значение student_id = 4, rank_id = 22 & style_id = 1

Он должен вернуться

id style_id level name  type primary_colour secondary_colour 
31 |  1 |  3 | Expert | Solid | #4e805b  | NULL 
+2

imo, единственный раз, когда применяется понятие «следующая строка», когда у вас есть «упорядоченный список»? Итак, сортируйте по рангу, а затем обработайте по мере необходимости? –

+2

@ RyanVincent Нет мнения, я думаю, нам абсолютно необходимо заказать здесь, чтобы придать смысл «следующему». –

+0

Да, я уже отсортирован по 'ranks.level' –

ответ

1

Попробуйте с этим:

SELECT * FROM `ranks` WHERE `level` > (SELECT `level` FROM `ranks` WHERE `id` = rank_id) LIMIT 1 

Но я думаю, что это не очень эффективное решение ,

+0

, то если бы я удалил «уровень 3», и это будет левый «уровень 1, 2, 4' –

+0

Я исправил свой ответ, и теперь он должен быть хорошим –

1

Если вы просто хотите, чтобы получить вторую строку: ли это так: структура

select * from 
(select * from table order by id asc limit 2) as a order by id desc limit 1 

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

+0

Этот будет показывать вторую запись всегда, так как вы пожелает. –

1

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

SELECT r2.* 
FROM RANKS r1 
INNER JOIN 
STUDENT_PROFILES s1 
    ON r1.id = s1.rank_id 
INNER JOIN 
RANKS r2 
    ON r2.level > r1.level 
ORDER BY r2.level 
LIMIT 1 

Демо здесь:

SQLFiddle

Примечание: Если RANKS имеет дублированные уровни, и вы хотите на следующий уровень в отношении мощности (т.е. вы не хотите дублировать одинаковый уровень), тогда мой запрос может быть слегка изменен, чтобы отфильтровать такие дубликаты.

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