|
|
|
| У меня есть база с картинками. Когда пользователь просматривает опредлённую картинку (известен идентификатор), нужно отобразить маленькие копии соседних. Меня интеревсует, как выбрать из базы строки которые при данном запросе находяться рядом с фиксированной. Если бы удалось узнать какой номер данной строки в данном результате, проблема была бы решена. | |
|
|
|
|
|
|
|
для: Osipov
(06.04.2007 в 17:49)
| | Вам придется завести переменную-счетчик и наращивать её в цикле выборки результата. | |
|
|
|
|
|
|
|
для: Trianon
(06.04.2007 в 18:20)
| | Можете по-подробнее? | |
|
|
|
|
|
|
|
для: Osipov
(06.04.2007 в 19:02)
| | Конечно. Если приведете пример кода, который делает выборку. | |
|
|
|
|
|
|
|
для: Trianon
(06.04.2007 в 20:05)
| | Скажем, выборка производиться SELECT id FROM image WHERE category='global' ORDER BY rate;
А нужный результат удовлетворяет условию id=100. | |
|
|
|
|
|
|
|
для: Osipov
(09.04.2007 в 17:25)
| | Это запрос.
А php-код то где?
Должен быть некоторый цикл, выбирающий строки результата [и выводящий их в браузер]
Как он у Вас выглядит? | |
|
|
|
|
|
|
|
для: Trianon
(09.04.2007 в 18:14)
| | В том-то и дело, что обрабатывается непосредственно только одна строка. Результат всего запроса может быть очень большой (много тысяч строк), поэтому получать его средствами PHP, а потом обрабатывать весь по-строкам не представляется возможным. У меня есть возможность ограничить результат до одной строки, но необходимо вывести соседние. Вот последнее-то и вызывает проблемы. | |
|
|
|
|
|
|
|
для: Osipov
(09.04.2007 в 18:39)
| | Напомню: Вас...
>...интеревсует, как выбрать из базы строки которые при данном запросе находяться рядом с фиксированной
Теперь же получается, что данного запроса у Вас нет. Вы его не запрашиваете. Раз нет запроса - то нет и результата запроса. Раз нет результата запроса - то (внимание!) нет порядка строк. Порядок строк может проявиться лишь в результате их вывода - в самой таблице он отсутствует.
Вам нужно считать рейтинг строк согласно заданным критериям. Причем критерии сравнения строк должны быть жесткими и не допускать неоднозначностей.
Не так давно похожая тема проходила.
Поглядите: http://softtime.ru/forum/read.php?id_forum=3&id_theme=35618 | |
|
|
|
|
|
|
|
для: Trianon
(09.04.2007 в 20:32)
| | Мне удалось решить эту проблему. Вот решение:
SET @counter:=0;
SELECT @counter, id FROM image WHERE <условие1> HAVING ((@counter:=@counter+1) OR 1) AND <условие2> ORDER BY <порядок>;
Идея заключается в том, что перед каждой проверкой <условия2> увеличивается счётчик --- переменная mysql. Таким образом, первый столбец результата будет показывать номер строки среди всех результатов, удовлетворяющих <условию1> (а во втором столбце будут id результатов, удовлетворяющих одновременно <условию1> и <условию2>). Затем просто читается значение первого столбца единственной строки (<условие2>, как я говорил ограничивает множество ршений до одного результата), скажем $x, и производиться выборка
SELECT id FROM image WHERE <условие1> LIMIT $x-2, 5;
Выведет пять ближайших результатов.
Единственный недостаток заключается в том, что используется довольно медленный оператор HAVING. Странно, что разработчики языка SQL не позаботились о пользователях, которым понадобилось выполнить эту совсем, не экзотическую задачу, во всяком случае никакого более простого решения, даже если разрешается изменять формат таблиц, я не знаю. | |
|
|
|
|
|
|
|
для: Osipov
(10.04.2007 в 16:50)
| | HAVING без GROUP BY - это не для меня.
По сути вопроса: критериев Вы так и не назвали. | |
|
|
|