За последние 24 часа нас посетили 16555 программистов и 1650 роботов. Сейчас ищут 2006 программистов ...

как извлечь предыдущий, следующий элемент записи?

Тема в разделе "MySQL", создана пользователем snoggl, 3 июн 2008.

  1. snoggl

    snoggl Активный пользователь

    С нами с:
    18 ноя 2006
    Сообщения:
    41
    Симпатии:
    0
    Адрес:
    СПб
    Здравствуйте, возможно ли составить такой вопрос:
    есть таблица photo{id, name, descr}
    допустим, знаем id=5
    надо извлечь предыдущий элемент таблицы и следующие, при сортировке по name.
    Т.е. если отсортированные по имени id элементов будут идти так:
    3, 1, 9, 5, 4, 7
    и нам задано d=5, то следующий элемент - 4, а предыдущий - 9.

    Такой запрос реально составить?
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    проще будет where name>$name order by asc|desc [limit]
     
  3. BS

    BS Активный пользователь

    С нами с:
    10 апр 2008
    Сообщения:
    149
    Симпатии:
    0
    armadillo, а если параметров в order by несколько?
    Тогда запись where param1>$param1 and param2 > $param2 работать не будет, поскольку первые параметры могут быть равны, а отличаться только вторые.

    Проще запоминать позицию текущего элемента в наборе, а затем выбирать предыдущий или следующий при помощи LIMIT

    Или же использовать искусственный rowid
     
  4. snoggl

    snoggl Активный пользователь

    С нами с:
    18 ноя 2006
    Сообщения:
    41
    Симпатии:
    0
    Адрес:
    СПб
    - если использовать limit, то заберется только текущий и следующий

    - а что это такое?
     
  5. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    В хранимую процедуру заверни
    SELECT name INTO @v_name FROM photo WHERE id = 5;
    SELECT name INTO @start_name FROM photo WHERE name < @v_name ORDER BY DESC LIMIT 1;
    SELECT * FROM photo WHERE name >= @start_name ORDER BY name;

    Можно конечно и подзапросами, но тормоза возможны
    SELECT * FROM photo WHERE name >=
    (SELECT name FROM photo WHERE name <
    (SELECT name FROM photo WHERE id = 5)
    ORDER BY DESC LIMIT 1)
    ORDER BY name;
     
  6. BS

    BS Активный пользователь

    С нами с:
    10 апр 2008
    Сообщения:
    149
    Симпатии:
    0
    Я так понимаю, ты хочешь сделать что-то типа фотогалереи, где показывается картинка и есть ссылки на предыдущую и следующую. Все ссылки ты формируешь сам, поэтому положение каждого элемента в возращаемом sql наборе данных тебе известно.

    Скажем изначально у тебя выводится первая картинка, тогда к ссылке на вторую картинку ты добавляешь ?pos=2

    тогда запрос у тебя будет вида:

    [sql]select * from photos order by name limit $pos-1,1[/sql]
    (тут $pos-1 ты вставишь удобным тебе способом), а ссылки на предыдущую и следующую будут соответственно ?pos=1 и ?pos=3
    Если сортировка у тебя происходит разными способами, то к ссылке добавишь еще и ее ?pos=2&sort=1
     
  7. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    подправил

     
  8. snoggl

    snoggl Активный пользователь

    С нами с:
    18 ноя 2006
    Сообщения:
    41
    Симпатии:
    0
    Адрес:
    СПб
    очень интересная идея, я попробую сделать
     
  9. snoggl

    snoggl Активный пользователь

    С нами с:
    18 ноя 2006
    Сообщения:
    41
    Симпатии:
    0
    Адрес:
    СПб
    так я тоже сделаю и сравню по времени с другим способом
     
  10. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Сравнивай лучше так

    SELECT * FROM photo WHERE name >=
    (SELECT name+sleep(1) FROM photo WHERE name <
    (SELECT name+sleep(1) FROM photo WHERE id = 5)
    ORDER BY name DESC LIMIT 1)

    Для каждого вызова подзапроса выполняется задержка в одну секунду.

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

    Если больше , то можешь легко посчитать сколько раз оптимизатор решит его выполнить :)

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

    Если записей немного и сервер не особо нагружен - как правило оно пофигу.
    Если нет ....