Здравствуйте, возможно ли составить такой вопрос: есть таблица photo{id, name, descr} допустим, знаем id=5 надо извлечь предыдущий элемент таблицы и следующие, при сортировке по name. Т.е. если отсортированные по имени id элементов будут идти так: 3, 1, 9, 5, 4, 7 и нам задано d=5, то следующий элемент - 4, а предыдущий - 9. Такой запрос реально составить?
armadillo, а если параметров в order by несколько? Тогда запись where param1>$param1 and param2 > $param2 работать не будет, поскольку первые параметры могут быть равны, а отличаться только вторые. Проще запоминать позицию текущего элемента в наборе, а затем выбирать предыдущий или следующий при помощи LIMIT Или же использовать искусственный rowid
В хранимую процедуру заверни 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;
Я так понимаю, ты хочешь сделать что-то типа фотогалереи, где показывается картинка и есть ссылки на предыдущую и следующую. Все ссылки ты формируешь сам, поэтому положение каждого элемента в возращаемом 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
Сравнивай лучше так 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) Для каждого вызова подзапроса выполняется задержка в одну секунду. Если в твоем случае оптимизатор отработает нормально, то время выполнения будет приблизительно на две секунды больше чем при без задержек. Если больше , то можешь легко посчитать сколько раз оптимизатор решит его выполнить Понятное дело - это корректно для данного набора данных. При увеличении ква записей - можно ожидать увеличения к-ва вызовов подзапросов со всеми вытекающими тормозами. Если записей немного и сервер не особо нагружен - как правило оно пофигу. Если нет ....