|
|
|
| Есть фотки, которые выводятся, сортируясь по id (ASC) и дате (DESC)
SELECT * FROM photos ORDER BY date DESC, id ASC
|
Дата задается произвольно, порядок строк в таблице изначально также произволен.
Требуется вытащить соседние по данному условию/сортировке фотки (предыдущую и следующую).
Что-то не могу догнать как.
Можно было бы сделать что-то вроде
SELECT * FROM photos WHERE id=7 ORDER BY date DESC, id ASC LIMIT -1,1
| (для предыдущей) - не было б проблем ))
Чувствую, тут пахнет гемором с вложенными запросами.
А один тут, кстати, уже есть )
Вот как выглядит "реальный" запрос для запроса фотки по id:
SELECT `p`.*, `b`.`name` AS `bar_name` FROM `sglr_photo_photo` AS `p`
LEFT JOIN `sglr_bars_bars` AS `b` ON p.dealer_id = b.id WHERE p.id = 21
| C | |
|
|
|
|
|
|
|
для: ddhvvn
(20.11.2010 в 15:07)
| | Выборка записи по id:
SELECT * FROM `photos` WHERE `id` = 7
|
Предположим, что дата этой фотографии '2010-11-14 21:58:20' или же соответствующий таймстамп - это не важно.
Выборка предыдущей записи:
SELECT * FROM `photos` WHERE `id` != 7 AND `date` >= '2010-11-14 21:58:20' ORDER BY `date` ASC, `id` DESC LIMIT 1
|
Выборка следующей записи:
SELECT * FROM `photos` WHERE `id` != 7 AND `date` <= '2010-11-14 21:58:20' ORDER BY `date` DESC, `id` ASC LIMIT 1
|
| |
|
|
|
|
|
|
|
для: luxemate
(20.11.2010 в 18:00)
| | Не подошло, так как записи перемешаны по айдишникам/датам
сейчас смотрю в сторону кучи запросов с использованием переменной и запроса с GROUP BY + HAVING
еще временные таблицы.
Пока более менее выходит что-то с переменной. но это еще нужно хорошенько оттестить + напрягает куча запросов...
SELECT number, id, date
FROM (SELECT @num := @num + 1 AS number, id, date FROM sglr_photo_photo ORDER BY date DESC, id ASC) AS tbl
WHERE id = 21
ORDER BY number ASC;
|
это выборка одной основной записи
SELECT number, id, date
FROM (SELECT @num := @num + 1 AS number, id, date FROM test ORDER BY date DESC, id ASC) AS tbl
WHERE number > 12
ORDER BY number ASC
LIMIT 1;
|
это выборка следующей записи
SELECT number, id, date
FROM (SELECT @num := @num + 1 AS number, id, date FROM test ORDER BY date DESC, id ASC) AS tbl
WHERE number < 12
ORDER BY number DESC
LIMIT 1;
|
а это предыдущей | |
|
|
|
|
|
|
|
для: ddhvvn
(20.11.2010 в 15:07)
| | Блин, с переменными это тупо (=долго) получается (((
Даже, если на лимит заменить в 2 запросах
Подкиньте еще что-нибудь, плииз... | |
|
|
|
|
|
|
|
для: ddhvvn
(22.11.2010 в 18:04)
| | Вроде бы получилось!! Вот такая шняга..
для предыдущей
(SELECT `id`, `date` FROM `photos` WHERE `id`<14 AND `date`=1290114000 ORDER BY `date` DESC, `id` DESC LIMIT 1)
UNION
(SELECT `id`, `date` FROM `photos` WHERE `id`>14 AND `date`>1290114000 ORDER BY `date` DESC, `id` DESC LIMIT 1)
ORDER BY `id` ASC LIMIT 1
|
для следующей
(SELECT id, date FROM `photos` WHERE id>21 AND date=1290114000 ORDER BY date DESC, id ASC)
UNION
(SELECT id, date FROM `photos` WHERE id<21 AND date<=1290114000 ORDER BY date DESC, id ASC) LIMIT 1
|
правда это и то пока без join'ов ... | |
|
|
|