Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выборка следующего по убыванию/возрастанию

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Anguis
Отправлено: 07 Июля, 2012 - 14:15:41
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




Здравствуйте вновь!
Делаю переключением между страницами по стрелкам. Стрелка "влево" переключает на предыдущую, "вправо" - следующую. По достижению минимальной или максимальной точки, должно вернуть страницу с начала списка. Т.е. если я долистал до крайней записи с максимальным id, то следующая должна вернуть запись "с начала" т.е. с минимальным id. Аналогично и для другого, если долистываем до минимума, то следующее должно быть максимумом.

Сделал так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = $page->db->query("SELECT url FROM `Pages` WHERE `data`='battle' AND `id`<{$page->id} ORDER BY `id` DESC LIMIT 1;");//запрашиваем следующую страницу
  3. if(!$sql->rowCount()) $sql = $page->db->query("SELECT url FROM `Pages` WHERE data='battle' ORDER BY `id` DESC LIMIT 1;");//если предыдущий запрос не дал результата, переходим к "начальной" записи
  4. $page->left = $sql->fetchColumn();//записываем результат в переменную для вывода в шаблон
  5.        
  6.  
  7. //аналогично для другой стрелки  
  8. $sql = $page->db->query("SELECT url FROM `Pages` WHERE `data`='battle' AND `id`>{$page->id} ORDER BY `id` ASC LIMIT 1;");
  9.  if(!$sql->rowCount()){$sql = $page->db->query("SELECT url FROM `Pages` WHERE data='battle' ORDER BY `id` ASC LIMIT 1;");}
  10. $page->right = $sql->fetchColumn();
  11.  


Собственно работает все. Но у меня все равно есть вопросы по оптимизации такого кода.
Хотелось-бы одним запросом, пробовал сделать так:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT url FROM `Pages` WHERE `data`='battle' AND (`id`>{$page->id} OR `id`> (SELECT MIN(id) FROM `Pages`)) ORDER BY `id` ASC LIMIT 1;
  3.  

Естественно, не работает. Выбирает всегда минимальную запись, так как подзапрос всегда выполняется первым.
Ну собственно возможно ли такое сделать одним запросом, и стоит ли так делать с точки зрения потребляемых ресурсов, ибо таблица обещает быть довольно большой? Т.е. ищу самый оптимальный с точки зрения ресурсов и лаконичности кода вариант реализации таких вот листалок.
 
 Top
Dezmont
Отправлено: 11 Июля, 2012 - 13:40:37
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




Не совсем понял, чего вы хотите добиться. И почему запрос не работает?
OR `id`> (SELECT MIN(id) FROM `Pages`) эта часть инструкции будет почти всегда выполняться, за исключением случая когда id=MIN(id).
Логику конечно лучше вынести за пределы базы. СУБД только хранение и вывод данных.
 
 Top
Anguis
Отправлено: 11 Июля, 2012 - 22:53:57
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




Dezmont, желаю оптимизировать. Хочу что-бы один запрос доставал сразу нужную запись, без доп. проверок
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB