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

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

  • Professor

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

    Spritz Авг. 8, 2010, 12:31 д.п., спустя 39 минут 45 секунд

    artoodetoo, ух как много написал =) рад что задачка понравилась. Теперь разъясню некоторые моменты.

    1) да URL уникальны, но сортировка объектов происходит по `id`(можно и другое поле, но никак не`url`)
    2) зачем `url` в базе хранить? Может я чегото не понимаю или неправильно делаю? Тогда просветите пожалуйста=)
    Есть адрес http://mysite.ru/informacionaya-stranica , дык вот, как мне узнать информацию об этой информационной странице? или айдишник передавать?
    http://mysite.ru/13
    Ну не красиво же
    3) в выборке нужна информация о нашей странице и о 2х окружающих ее. У окружающих нужно только url
  • Professor

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

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

    если делать как я то при 100000 строк в базе скрипт выполняется
    Сделано за: 1.54928517342 секунд
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Авг. 8, 2010, 4:07 д.п., спустя 2 часа 55 минут 49 секунд

    полторы секунды это дофига!


    1) да URL уникальны, но сортировка объектов происходит по `id`(можно и другое поле, но никак не`url`)

    значит ORDER BY оставляешь по id

    2) зачем `url` в базе хранить? Может я чегото не понимаю или неправильно делаю? Тогда просветите пожалуйста=)
    Есть адрес http://mysite.ru/informacionaya-stranica , дык вот, как мне узнать информацию об этой информационной странице? или айдишник передавать?
    http://mysite.ru/13
    Ну не красиво же

    судя по твоей таблице из первого поста, url это производная от поля name. значит хранить URL не надо

    3) в выборке нужна информация о нашей странице и о 2х окружающих ее. У окружающих нужно только url

    1. какой-то "роутер" должен по входящему URL вычислить соответствующую запись в таблице. не будем вникать как. значит у тебя будет нужная запись вместе с id !!!
    2. дальше про next и previous я написал. ну добавь во внешний запрос name чтобы было удобно вычислять урлы
    SELECT id, name…
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Авг. 8, 2010, 4:16 д.п., спустя 9 минут 13 секунд

    p.s. я понял. ты называешь урлом не весь урл, а просто транслитерированную версию name. ну ты умеешь усложнить себе жизнь. попросил бля хлебушка!
    типа чтобы удобно было искать. только это не URL. назови его token чтоли или translit_name! :) всё что я написал выше остается в силе.
    ιιlllιlllι унц-унц
  • VaseninM

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

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

    Вы можете назвать меня говнокодером. Но я бы сделал так:
    <?php
    $id = $db->getOne("SELECT `id` FROM `pages` WHERE `url` = '$url' LIMIT 1");
    $prev = $db->getOne("SELECT `url` FROM `pages` WHERE `id` < '$id' ORDER BY asc LIMIT 1");
    $next = $db->getOne("SELECT `url` FROM `pages` WHERE `id` > '$id' ORDER BY desc LIMIT 1");
    if ($prev) {
    echo "<a href = '/$prev'>Предыдущий</a>";
    }
    if ($next) {
    echo "<a href = '/$next'>Следующий</a>";
    }
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Авг. 8, 2010, 4:33 д.п., спустя 9 минут 54 секунды

    гений! подумай что будет если наша запись первая или последняя
    ιιlllιlllι унц-унц
  • VaseninM

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

    Spritz Авг. 8, 2010, 4:52 д.п., спустя 18 минут 53 секунды

    artoodetoo,
    <?php
    /**
    * Первая норм
    * Последняя норм
    */
    $id = $db->getOne("SELECT `id` FROM `pages` WHERE `url` = '$url' LIMIT 1");
    /**
    * Первая предыдущий нет. Получаем пустой результат
    * Последняя норм
    */
    $prev = $db->getOne("SELECT `url` FROM `pages` WHERE `id` < '$id' ORDER BY asc LIMIT 1");
    /**
    * Первая норм
    * Последняя пустой результат иб слдущей нет
    */
    $next = $db->getOne("SELECT `url` FROM `pages` WHERE `id` > '$id' ORDER BY desc LIMIT 1");
    /**
    * Первая - выведет только следущий ибо предыдущий пустой и приведется к bool типу false. Я не проверял, ну если что можено заюзать empty()
    * Последняя - выдаст только предыдущий.
    * Остальные - выведет оба линка.
    */
    if ($prev) {
    echo "<a href = '/$prev'>Предыдущий</a>";
    }
    if ($next) {
    echo "<a href = '/$next'>Следующий</a>";
    }
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Авг. 8, 2010, 5:08 д.п., спустя 15 минут 54 секунды

    ну хз. мне как-то не по себе видеть три SQL запроса, где можно обойтись одним. дело вкуса
    ιιlllιlllι унц-унц
  • Voronenok

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

    Spritz Авг. 18, 2012, 10:52 д.п., спустя 741 день 5 часов 43 минуты

    Некоторые люди почему - то считают себя колдунами и экстрасенсами.
  • Barbos

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

    Spritz Авг. 18, 2012, 11:25 д.п., спустя 33 минуты 43 секунды

    Эээээ что-бы понравилось? По любому в твоем возрасте каждый день что-то меняется

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