[MySQL] Быстро узнать порядковый номер данной строки среди удовлетворя

kruzer25

Есть таблица, в ней куча строк... надо узнать, какой порядковый номер будет у строки с данным ID в под-таблице всех строк, удовлетворяющих данному условию... есть подозрение, что это делается одним селектом - а как?

kruzer25

Ап... неужели никто не знает, как это сделать?
В форумах, например - как определяется, что какой-то пост находится на конкретной странице треда?

Dasar

> В форумах, например - как определяется, что какой-то пост находится на конкретной странице треда?
Обычно через задницу.
зы
можно, например, заметить, что в этом форуме - это работает неправильно.

klyv

А самому посмотреть исходники форума?

kruzer25

Долго и нудно разбираться, непонятно даже, где искать...
В нашем форуме это вроде бы делается относительно нормально?
Так неужели никак не сделать это, не меняя существующей структуры данных, кроме как SELECT * WHERE xxx считать ещё одной таблицей, прикручивать к нему свои id и смотреть уже в этой новой таблице номер нужной строки?

splinter

Зачем его определять? Можно выводить сообщения через запрос:
select * from `posts` by order date asc limit ($page_number-1)*($post_per_page$page_number)*($post_per_page);

mysha

средствами SQL без использования вложенных запросов этого сделать нельзя.
В форуме AFAIK сначала вытягиваются все пары ключ-значение, и уже по ним скриптом выбирается что показывать.
говорят это получается даже быстрее LIMIT.

mysha

а как узнать номер страницы, если я например хочу вывести конкретную страницу, на которую попала запись?
Особенно если у тебя помножено несколько таблиц и сделан сложный сорт.

splinter

хз. Так сразу не могу ответить ... возможно придется клепать еще одну таблицу в которой будет храниться необходимая информация для получения результата.

kruzer25

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

kruzer25

Собственно, про это и был вопрос... можно это сделать за один селект, или надо считать результат новой таблицей и вводить ID на нём...
Похоже, легче поменять структуру данных...

bleyman

Если ты знаешь Id поста, а ещё знаешь, что Id монотонно возрастает (то есть все посты старше данного гарантированно имеют меньший Id) то на MSSQL номер поста в треде забирается так:
SELECT COUNT(*) FROM Posts WHERE Posts.Id < @TargetId AND (проверка на принадлежность данной странице)

kruzer25

О, спасибо!
Всё гениальное просто...

gopnik1994

проблемы начнутся, если порядок вывода строк (сортировка) не будет совпадать с возрастанием ID...

kruzer25

А он по умолчанию не по возрастанию ИД?
Кроме тогоь, разве не получится к тому запросу добавить SORT BY id?

kruzer25

SELECT COUNT(*) FROM posts WHERE thread=123 AND id<456 ORDER BY id ASC;
?

gopnik1994

тебе из надо в этом порядке выводить?
тогда все ок.

gopnik1994

кста, глупый вопрос: а хранимых процедур там нету?

kruzer25

Я не настолько разбираюсь в mysql, чтобы знать, что такое "ранимые процедуры"
Честно говоря, я впервые стал с ним работать пару недель назад

6yrop

 
есть подозрение, что это делается одним селектом - а как?
делается. Уже написали?

kruzer25

Да - в предыдущих постах
Оставить комментарий
Имя или ник:
Комментарий: