Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Получить соседние по условию записи
 
 автор: ddhvvn   (20.11.2010 в 15:07)   письмо автору
 
 

Есть фотки, которые выводятся, сортируясь по 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

  Ответить  
 
 автор: luxemate   (20.11.2010 в 18:00)   письмо автору
 
   для: 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

  Ответить  
 
 автор: ddhvvn   (21.11.2010 в 01:25)   письмо автору
 
   для: 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   (22.11.2010 в 18:04)   письмо автору
 
   для: ddhvvn   (20.11.2010 в 15:07)
 

Блин, с переменными это тупо (=долго) получается (((
Даже, если на лимит заменить в 2 запросах
Подкиньте еще что-нибудь, плииз...

  Ответить  
 
 автор: ddhvvn   (22.11.2010 в 19:35)   письмо автору
 
   для: 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'ов ...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования