ФорумПрограммированиеPHP для идиотов → Выборка информации о следующем и предыдущем элементе.

Выборка информации о следующем и предыдущем элементе.

  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz Авг. 7, 2010, 10:31 д.п.

    Здрасьте.
    Чет затупил, не могу придумать как это сделать. На ум приходят решения где нужно до 3х запросов к БД =(
    в общем есть таблица элементов
    [table]
    [tr]
    [td]id[/td]
    [td]name[/td]
    [td]url[/td]
    [/tr]
    [tr]
    [td]1[/td]
    [td]какашка[/td]
    [td]kakashka[/td]
    [/tr]
    [tr]
    [td]2[/td]
    [td]мусорка[/td]
    [td]musorka[/td]
    [/tr]
    [tr]
    [td]3[/td]
    [td]карандаш[/td]
    [td]karandash[/td]
    [/tr]
    [tr]
    [td]4[/td]
    [td]кошка[/td]
    [td]koshka[/td]
    [/tr]
    [/table]

    нам известно url, допустим musorka

    нужно выбрать данные о первом, втором и третьем элементе.
    если url равно koshka то нужно выбрать третий, четвертый и первый элементы.


    Нужно это для того что бы ссылочки поставить "следующий элемент" и "предыдущий элемент"

    Жду ваших мыслей по данному вопросу.
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz Авг. 7, 2010, 10:40 д.п., спустя 9 минут 14 секунд

    есть такая идея… если айдишники в нормальном порядке буду, то есть без прерываний (что мало вероятно), то можно попробовать так:
    SELECT * FROM table WHERE id={$id-1} LIMIT 3

    что-нить типа такого))
    Высокоуровневое абстрактное говно
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz Авг. 7, 2010, 10:51 д.п., спустя 10 минут 52 секунды

    Да, вы правы, это к сожалению мало вероятно.
  • tartar

    Сообщения: 186 Репутация: N Группа: Кто попало

    Spritz Авг. 7, 2010, 11:19 д.п., спустя 28 минут 23 секунды

    смахивает на постраничную навигацию может быть её переделать под "следующий элемент" и "предыдущий элемент"
    а $nums (кол-во записей, выводимых на страницу) поставить 1
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz Авг. 7, 2010, 11:31 д.п., спустя 12 минут 1 секунду


    (SELECT MIN(t.id) AS target,t.* FROM table t HAVING t.id = target) UNION (SELECT 1,t.* FROM table t WHERE t.id < 10 ORDER BY t.id DESC LIMIT 1) UNION (SELECT 1,t.* FROM table t WHERE t.id > 10 LIMIT 1)

    вместо 10 - твой ID страницы
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz Авг. 7, 2010, 12:10 п.п., спустя 38 минут 40 секунд

    Faster, научи такие космические запросы штамповать))
    Высокоуровневое абстрактное говно
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz Авг. 7, 2010, 12:10 п.п., спустя 19 секунд

    tartar, нет, это не то что нужно. хотя можно под это переделать.
    Faster, спасибо конечно, но это те же 3 запроса
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz Авг. 7, 2010, 12:23 п.п., спустя 4 минуты 7 секунд


    Faster, научи такие космические запросы штамповать))

    ничего космического, обычный UNION - в констексте вопроса дает выигрыш на соединение с БД (1 вместо 3)
    кстати я так и не понял зачем зацикливать на первую запись, если нет следующей
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz Авг. 7, 2010, 12:25 п.п., спустя 2 минуты 18 секунд

    кстати я так и не понял зачем зацикливать на первую запись, если нет следующей

    согласен, это лишний гемор…
    Высокоуровневое абстрактное говно
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 7, 2010, 12:25 п.п., спустя 14 секунд

    походу фейл.
    Могу предложить в два запроса. Сам запрос писать не буду ибо херова знаю все эти юнионы и джойны, но по сути примерно так:
    Сначала узнаем id предыдущего элемента (типа SELECT id FROM page WHERE id < 10 LIMIT 1 ORDER BY ASC) и потом  получить три записи id которых больше или равно полученому
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz Авг. 7, 2010, 12:29 п.п., спустя 3 минуты 39 секунд

    кстать, действительно проще будет, если добавить столбик с временем создания, по нему искать предыдущий, а дальше либо моим способом, либо еще каким))
    я, конечно, не настаиваю, что мой способ ниипаццо крут, но мне кажется, что довольно просто))
    Высокоуровневое абстрактное говно
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 7, 2010, 12:39 п.п., спустя 10 минут 6 секунд

    Stasovsky, че? Зачем?
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz Авг. 7, 2010, 12:40 п.п., спустя 58 секунд

    да так, мысли вслух)) не обращай внимания))
    Высокоуровневое абстрактное говно
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz Авг. 7, 2010, 12:53 п.п., спустя 12 минут 57 секунд

    В общем как сделал я

     $sql = $this->db->query("SELECT * FROM `home` ORDER BY id");
     
           while ($row = mysqli_fetch_assoc($sql)) {

               if ($url == $row["url"]) {
                   $homePrev = $homePrevTrap;
                   $infoAll = $row;
               }

               if ($url == $homePrevTrap) {
                   $homeNext = $row["url"];
                   break;
               }
               $homePrevTrap = $row["url"];
           }


    и того получается что в переменной $infoAll хранится информация о нужной странице
    В переменных $homePrev и $homeNext ссылки на предыдущий и следующий элементы соответственно.
    Зацикливание пришлось убрать  =)
    Вот терь думаю может как SpartakuS, посоветовал 2мя запросами сделать?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!