2009-02-27 3 views
1

Как я могу сделать, чтобы получить следующую строку в таблице?Получить предыдущую и следующую строку с текущего идентификатора

`image_id` int(11) NOT NULL auto_increment 
`image_title` varchar(255) NOT NULL 
`image_text` mediumtext NOT NULL 
`image_date` datetime NOT NULL 
`image_filename` varchar(255) NOT NULL 

Если текущее изображение 3, например, и на следующий один 7 и т.д., это не будет работать:

$query = mysql_query("SELECT * FROM images WHERE image_id = ".intval($_GET['id'])); 
echo $_GET['id']+1; 

Как я должен делать?

спасибо

ответ

2

Вы очень близко. Попробуйте это:

$query = mysql_query("SELECT * FROM images 
        WHERE image_id > ".intval($_GET['id'])." ORDER BY image_id LIMIT 1"); 

    <?php echo $_GET['id'] ?> 
+0

Дети, пожалуйста, не делайте этого дома. Это кричит [SQL injection] (https://en.wikipedia.org/wiki/SQL_injection). Используйте PDO и/или параметризованные запросы. – sleske

11
SELECT * FROM images WHERE image_id < 3 ORDER BY image_id DESC LIMIT 1 -- Previous 
SELECT * FROM images WHERE image_id > 3 ORDER BY image_id LIMIT 1 -- Next 
4

Если вы хотите, чтобы обвести записи, вы можете использовать это:

-- previous or last, if there is no previous 
SELECT * 
FROM images 
WHERE image_id < 12345 OR image_id = MAX(image_id) 
ORDER BY image_id DESC 
LIMIT 1 

-- next or first, if there is no next 
SELECT * 
FROM images 
WHERE image_id > 12345 OR image_id = MIN(image_id) 
ORDER BY image_id ASC 
LIMIT 1 

То же самое с UNION, может быть еще более эффективным:

-- previous or last, if there is no previous 
(SELECT * FROM images WHERE image_id < 12345 ORDER BY image_id DESC LIMIT 1) 
UNION (SELECT * FROM images WHERE image_id = (SELECT MAX(image_id) FROM images)) 
LIMIT 1 

-- next or first, if there is no next 
(SELECT * FROM images WHERE image_id > 12345 ORDER BY image_id ASC LIMIT 1) 
UNION (SELECT * FROM images WHERE image_id = (SELECT MIN(image_id) FROM images)) 
LIMIT 1 
+0

Ваш ответ действительно крут, и как насчет случая с изображением таблицы есть еще одно поле: 'image_type'. Я хочу выбрать следующий/первый и предыдущий/последний, для которого image_type = $ img_type. Обратите внимание, что следующие/первые или предыдущие/последние относятся к определенному объекту image_type ($ img_type), а не ко всем изображениям. –

+0

@AJOP Включите существующее условие 'WHERE' в круглых скобках и добавьте к нему условие' AND'. – Gumbo

+0

Я думаю, что не могу использовать функции MAX и MIN() в инструкции Where, но я не знаю почему? –

0

Пожалуйста, для любви к Интернету, не строите SQL-запрос самостоятельно. Используйте PDO.

+5

Пожалуйста, для любви к StackOverflow, не пишите такие ответы. Используйте комментарии. –

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