Цикл по результатам MySQL - PullRequest
1 голос
/ 20 июля 2011

Я не уверен, как именно это называется, но я постараюсь описать как можно лучше то, что я хочу достичь.

Итак, во-первых, есть переменная с именем $id, которая на самом деле $_GET['id']. Предполагая, что пользователь заходит на следующую страницу с запросом: /page.php?id=6. Теперь мне нужно предоставить информацию о следующих трех страницах из базы данных. Вот база данных:

  TABLE `pages`

  id   |   page_name
  ______________________
  1    |   AAAAA
  2    |   BBBBB
  3    |   CCCCC
  4    |   DDDDD
  5    |   EEEEE
  6    |   FFFFF
  7    |   GGGGG
  8    |   HHHHH
  9    |   IIIII

Итак, при запросе страницы с идентификатором 6 следующий скрипт возвращает следующие 3 страницы (7,8,9):

 $res = mysql_query("SELECT * FROM `pages` WHERE `id`>'".intval($id)."' ORDER BY `id` DESC LIMIT 3");
 while($arr = mysql_fetch_assoc($res))
 {
       print("Page ID: ".$arr['id']."; Page Name: ".$arr['page_name']."\n");
 }

А вот и вывод:

 Page ID: 7; Page Name: GGGGG
 Page ID: 8; Page Name: HHHHH
 Page ID: 9; Page Name: IIIII

И он работает нормально до тех пор, пока $id не станет больше 6. Когда он равен (/page.php?id={7/8/9}), на выходе больше не будет отображаться 3 страницы, а на 2 страницах, 1 странице и, соответственно, нет вывода, когда $id is 9.

Итак, мой вопрос: есть ли способ вернуться назад и начать с самого начала, когда недостаточно результатов (меньше 3) для отображения?

  • При доступе к /page.php?id=8 вывод должен содержать страницы с идентификаторами 9, 1 и 2.
  • При доступе к /page.php?id=9 вывод должен содержать страницы с идентификатором 1, 2, 3.
  • При доступе к /page.php?id=3 вывод должен содержать страницы с идентификатором 4, 5, 6 и т. Д.

Ответы [ 3 ]

4 голосов
/ 20 июля 2011
(SELECT *, 0 AS custom_order FROM `pages` WHERE `id`>'".intval($id)."' ORDER BY `id` ASC LIMIT 3)
UNION ALL
(SELECT *, 1 AS custom_order FROM `pages` ORDER BY `id` ASC LIMIT 3)
ORDER BY custom_order, id ASC
LIMIT 3

Таким образом, вы всегда получаете 3 страницы.Если следующих страниц недостаточно, вы получите до 3 с начала.

0 голосов
/ 20 июля 2011

Я бы решил так (одна из возможных проблем заключается в том, что набор результатов может содержать не более 6 записей вместо 3):

$res = mysql_query("(SELECT * FROM `pages` WHERE `id`>'".intval($id)."' ORDER BY `id` ASC LIMIT 3) UNION DISTINCT (SELECT * FROM `pages` WHERE id>0 ORDER BY id ASC LIMIT 3)");
$counter = 0;
 while($arr = mysql_fetch_assoc($res) && $counter<3)
 {
       $counter++;
       print("Page ID: ".$arr['id']."; Page Name: ".$arr['page_name']."\n");
 }
0 голосов
/ 20 июля 2011

Вы можете изменить запрос так:

 select * from 
     (select *, id-$inval($id) as order_by 
         from pages were id > $inval($id) order by id asc limit 3
      union
      select *, id as order_by 
         from pages order by id asc limit 3 ) as pages
 order by order_by asc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...