Индекс записи в таблице - PullRequest
1 голос
/ 06 марта 2009

Мне нужно найти позицию индекса записи в большой таблице базы данных, чтобы предварительно установить пейджер на страницу этого элемента. Мне нужен эффективный SQL-запрос, который может дать мне этот номер. К сожалению, SQL не предлагает что-то вроде:

SELECT INDEX(*) FROM users WHERE userid='123'

Какие-нибудь яркие идеи?

РЕДАКТИРОВАТЬ: Предположим, что к нему добавлено предложение ORDER BY. Дело в том, что я не хочу загружать все записи, чтобы определить местоположение конкретной. Я пытаюсь открыть пейджер на странице, содержащей уже выбранный ранее элемент - потому что я хочу предоставить информацию об этом уже выбранном элементе в контексте, который позволяет пользователю выбрать другой элемент.

Ответы [ 4 ]

3 голосов
/ 06 марта 2009

Вы можете использовать что-то вроде (псевдокод):

  • запрос подсчета: $ n = выбрать количество (uid) из {users} where ... (ваше условие подкачки, включая ID пользователя 123 в качестве ограничения)
  • $ page = floor ($ n / $ pager_size);
  • запрос на отображение: выберите то, что вы хотите от {пользователи} где (ваше условие подкачки без ограничения), передано в db_query_range (запрос, $ page, $ pager_size)

Вы действительно должны взглянуть на pager_query , хотя, потому что это то, о чем это все, и в основном это работает так: запрос подсчета и запрос отображения, за исключением того, что он пытается автоматически построить запрос подсчета.

1 голос
/ 06 марта 2009

Предполагая, что вы действительно спрашиваете, как публиковать записи в 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 
0 голосов
/ 06 марта 2009

Вас может заинтересовать то, что имитирует rownum() Oracle в MySQL ... если вы используете MySQL, конечно, так как это не указано в вопросе.


Примечания

Вы должны будете просмотреть все записи на своих страницах, чтобы это работало, конечно. Вам не нужно извлекать их обратно на страницу PHP с сервера базы данных, но вам придется включить их в запрос. Не существует волшебного трюка для определения позиции вашей строки в наборе результатов, кроме запроса набора результатов, поскольку он может измениться из-за условий where, порядков и групп. Это должно быть в контексте.

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

0 голосов
/ 06 марта 2009

SQL не гарантирует порядок объектов в таблице, если вы не используете предложение OrderBy. Другими словами, индекс любой конкретной строки может измениться в последующих запросах. Можете ли вы описать, что вы пытаетесь достичь с помощью пейджера?

...