MySQL - следующий/предыдущий идентификатор с зацикливанием

Мне нужно создать предыдущую/следующую функциональность с зацикливанием. Мое текущее решение, если я выберу MAX(ID), будет следующим как NULL.

Как мне наиболее эффективно получить MIN(ID) вместо NULL(и наоборот для другого направления). Конечно, я могу использовать IF или просто создать второй запрос, если мой результат равен NULL, но мне интересно, есть ли лучшее решение.

В моей таблице три столбца

ex:

ID     foto    like

3        A      0
4        B      0
5        C      0
10       D      0

Если я выберу ID 4, следующий будет 5, предыдущий будет 3 // это решение, которое у меня есть

Для идентификатора 3 следующий – 4, предыдущий – 10 // это то, что я хочу

Для предыдущего/следующего я использую этот запрос

(
    SELECT MIN(`ID`) AS id 
    FROM fotos 
    WHERE `ID` > '$this->id'
    ORDER BY `like` DESC
)
UNION
(
    SELECT MAX(`ID`) AS id 
    FROM fotos 
    WHERE `ID` < '$this->id'                                            
    ORDER BY `like` DESC
)

$this->id на самом деле выбрано и отображается фото


person Martin Perry    schedule 13.06.2013    source источник
comment
вам нужен следующий и предыдущий идентификатор текущего foto, я прав??   -  person M Khalid Junaid    schedule 13.06.2013
comment
@dianuj Да .. точно   -  person Martin Perry    schedule 13.06.2013


Ответы (1)


для следующего и предыдущего идентификатора для текущего foto вы можете сделать так

SELECT COALESCE((SELECT id FROM `foto` WHERE id<'$this->id' ORDER BY DESC id LIMIT 1),
       (SELECT  MAX(id) FROM `foto`))  AS `prev`,
       COALESCE((SELECT id FROM `foto` WHERE id>'$this->id' ORDER BY id LIMIT 1 ),
       (SELECT MIN(id) FROM `foto`)) AS `next`

Надеюсь, он отлично подходит для ваших нужд

person M Khalid Junaid    schedule 13.06.2013
comment
Решение почти в порядке, я принял его. Единственная проблема заключается в том, что вторая часть COALESCE с MIN/MAX не учитывает ORDER BY как первую часть. Но у меня это неправильно в моем решении. - person Martin Perry; 13.06.2013