Вопрос

Мне нужно определить позицию индекса записи в большой таблице базы данных, чтобы настроить переход на страницу этого элемента.Мне нужен эффективный 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, порядков и групп.Это должно быть в контексте.

Конечно, если все ваши строки являются последовательными с добавочными идентификаторами, ни одна из них не удаляется, и вы знаете первый и последний идентификаторы;тогда вы могли бы использовать подсчет и с помощью простой математики получить позицию, не запрашивая все подряд....но я сомневаюсь, что это ваш случай, так никогда не бывает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top