Индекс записи в таблице
-
03-07-2019 - |
Вопрос
Мне нужно определить позицию индекса записи в большой таблице базы данных, чтобы настроить переход на страницу этого элемента.Мне нужен эффективный SQL-запрос, который может выдать мне этот номер.К сожалению, SQL не предлагает что-то вроде:
SELECT INDEX(*) FROM users WHERE userid='123'
Есть какие-нибудь блестящие идеи?
Редактировать:Давайте предположим, что к этому добавлено предложение ORDER BY .дело в том, что я не хочу загружать все записи, чтобы определить местоположение конкретной записи.Я пытаюсь открыть пейджер на странице, содержащей существующий элемент, который был ранее выбран, потому что я хочу предоставить информацию об этом уже выбранном элементе в контексте, который позволяет пользователю выбрать другой.
Решение
Вы могли бы использовать что-то вроде (псевдокод):
- запрос на подсчет голосов:$ n = выберите count(uid) из {users}, где ...(ваше условие подкачки, включая userid 123 в качестве ограничения)
- $страница = этаж($n / $pager_size);
- отобразить запрос:выберите, что вы хотите от {users} where (ваше условие подкачки без ограничения), переданное в db_query_range (запрос, $page, $pager_size)
Вам действительно стоит взглянуть на pager_query запрос страницы, хотя бы потому, что в этом все дело, и в основном это работает следующим образом:запрос подсчета и запрос отображения, за исключением того, что он пытается создать запрос подсчета автоматически.
Другие советы
Предполагая, что вы действительно спрашиваете, как создавать записи в SQL Server 2005 и более поздних версиях, посмотрите на этот код по адресу Дэвид Хейден :
(вам нужно изменить столбцы «Дата», «Описание»)
CREATE PROCEDURE dbo.ShowUsers
@PageIndex INT,
@PageSize INT
AS
BEGIN
WITH UserEntries AS (
SELECT ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row, Date, Description
FROM users)
SELECT Date, Description
FROM UserEntries
WHERE Row BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize
END
SQL не гарантирует порядок объектов в таблице, если вы не используете предложение OrderBy. Другими словами, индекс любой конкретной строки может измениться в последующих запросах. Можете ли вы описать, что вы пытаетесь достичь с помощью пейджера?
Возможно, вас заинтересует что-то, что имитирует rownum()
оракула в MySQL...если вы используете MySQL, конечно, поскольку это не указано в вопросе.
Примечания:
Конечно, вам придется просмотреть все записи на ваших страницах, чтобы это сработало.Вам не нужно извлекать их обратно на страницу PHP с сервера базы данных, но вам придется включить их в запрос.Нет никакого волшебного трюка для определения положения вашей строки внутри результирующего набора, кроме запроса результирующего набора, поскольку он может измениться из-за условий where, порядков и групп.Это должно быть в контексте.
Конечно, если все ваши строки являются последовательными с добавочными идентификаторами, ни одна из них не удаляется, и вы знаете первый и последний идентификаторы;тогда вы могли бы использовать подсчет и с помощью простой математики получить позицию, не запрашивая все подряд....но я сомневаюсь, что это ваш случай, так никогда не бывает.