Я работаю с общей панелью данных, которая может иметь множество различных запросов, подающих эту панель. Они могут быть простыми запросами, которые выбираются из таблицы или представления, или сложными, которые пользователи определяют со сложными объединениями и другими выражениями. Я пытаюсь изменить мою панель данных, чтобы, если пользователь выбирает запись, сортирует таблицу, я нахожу страницу, на которой сейчас записывается запись, переместится на нее, а затем повторно выберите запись.MySql: найдите номер строки конкретной записи
У меня есть большая часть этого, но у меня проблемы с поиском номера страницы для перехода. Я изначально просто зацикливал строки на панели данных, но из-за пейджинга это оказалось очень неэффективным, чем больше номер страницы. Вместо этого я решил сделать это прямо через SQL, где я сейчас застрял.
Я решил, что если бы я смог найти номер строки из выбранной строки, запустив тот же запрос, который дал результаты, я мог бы рассчитать номер последней страницы, который мне нужно переместить, и перейти прямо к этой странице. Я взял запрос, который был запущен для генерации результатов, и увеличил переменную, чтобы получить номера строк.
Исходный запрос был
select *
from table_a
order by column_c desc
И измененный запрос с номерами строк стал
select *, (@rownum := @rownum + 1) as rownum
from
(select @rownum := 0) rn
, (
select *
from table_a
order by column_c desc
) data
На данный момент я выбрать все записи. Затем я обернут приведенный выше запрос и выбрал минимальную строку, в которой запись согласованной выбранный мой рекорд как так
select min(rownum)
from
(
select *, (@rownum := @rownum + 1) as rownum
from
(select @rownum := 0) rn
, (
select *
from table_a
order by column_c desc
) data
) wrapper
where
primarykeyfield1 = ?
and primarykeyfield2 = ?
Сначала это казалось, работает. Однако во время тестирования я обнаружил, что если бы я отсортировал поле, которое было недостаточно уникальным (например, 1000 записей имели одинаковое значение в этом поле), он переставал работать. Я сделал рытье и обнаружил, что вышеприведенный код будет возвращать разные rownum каждый раз, когда запрос выполняется.
После некоторого дополнительного копания, я обнаружил, что если были выполнить следующий запрос, я хотел бы получить результаты, которые я хотел
select * from table_a order by column_c
Но если я просто завернутые этот запрос, как так
select * from (select * from table_a order by column_c)
Порядок записей сильно менялся каждый раз, когда я запускал запрос. Это объясняет, почему строка num менялась, потому что она фактически меняется. Однако я не могу понять, почему заказ изменился бы просто путем обертывания запроса. Я сделал это в других системах баз данных, поэтому я предполагаю, что это связано с MySql, но я не смог найти информацию, чтобы объяснить, почему. Моя презумпция заключается в том, что порядок by либо не применяется при завершении запроса таким образом, либо поведение не так, как ожидалось.
Далее я попытался переместить количество RowNum непосредственно в основной/базовый запрос как так
select *, (@rownum := @rownum + 1) as rownum
from (select @rownum := 0) rn, table_a
order by column_c desc
Выполнение этого запроса само по себе создает правильные номера строк. Однако, так как мне нужно, чтобы найти конкретную строку Num выбранной записи я должен обернуть этот запрос, как так
select min(rownum)
from (
select *, (@rownum := @rownum + 1) as rownum
from (select @rownum := 0) rn, table_a
order by column_c desc
) data
where
primarykeyfield1 = ?
and primarykeyfield2 = ?
Как только я это делаю, заказ по-видимому, игнорируется, и он рассчитывает вещи в порядке что записи отображаются в таблице, а не в порядке, в котором они находятся в базовом запросе.
Я заинтересован в том, чтобы понять основную проблему, когда сортировка набора данных не применяется корректно при завершении, а также возможные другие решения для поиска номера страницы, на которой записана спецификация.
Обратите внимание, что я использую min для окончательного внешнего запроса, потому что в конечном итоге пользователь может выбрать несколько строк, и все эти строки входят в конечное предложение where. Поэтому я хочу найти наименьшее число строк и перейти на эту страницу.
Рассмотрите упрощение своей проблемы. Никто не хочет читать все это! – Strawberry
Также укажите схему базы данных и, желательно, некоторые данные примера. –