Pergunta

Preciso localizar a posição de índice de um registro em uma tabela de banco de dados grande, a fim de predefinir um pager para a página do item. Eu preciso de uma consulta SQL eficiente que pode me dar esse número. Infelizmente SQL não oferece algo como:

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

Qualquer brilhantes ideias?

EDIT: Vamos supor que há uma cláusula ORDER BY em anexo ao presente. o ponto é que eu não quero ter que carregar todos os registros para localizar a posição de um específico. Estou tentando abrir um pager para a página segurando um item existente que anteriormente tinha sido escolhido -. Porque eu quero fornecer informações sobre esse item já escolhido dentro de um contexto que permite ao usuário escolher um diferente

Foi útil?

Solução

Você pode usar algo como (pseudo-código):

  • consulta contagem: $ n = select count (uid) de {users} onde ... (sua condição paginação incluindo UserID 123 como limite)
  • $ page = andar ($ n / $ pager_size);
  • consulta display: selecionar o que, você, quer de {users} onde (a sua condição de paginação sem o limite), passou para db_query_range (thequery, $ page, $ pager_size)

Você deve realmente olhar para pager_query , no entanto, porque isso é o que é tudo sobre, e que basicamente funciona assim:. uma consulta de contagem e uma consulta de exibição, exceto que ele tenta construir a consulta contagem automaticamente

Outras dicas

Assumindo que você está realmente perguntando como registros de página no SQL Server 2005 em diante, ter um olhar para este código de David Hayden :

(você vai precisar alterar data, a descrição a ser suas colunas)

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 não garante a ordem dos objetos na tabela a menos que você use a cláusula OrderBy. Em outras palavras, o índice de qualquer linha particular pode mudar em consultas subsequentes. Você pode descrever o que você está tentando realizar com o pager?

Você pode estar interessado em algo que simula o rownum() da Oracle no MySQL ... se você estiver usando MySQL, claro, como não é especificado na questão.


Notas :

Você vai ter que olhar através de todos os registros de suas páginas para que funcione é claro. Você não precisa buscá-los de volta para a página PHP a partir do servidor de banco de dados, mas você vai ter que incluí-los na consulta. Não há nenhum truque de mágica para determinar a posição de sua linha dentro de um conjunto de resultados que não consultar o conjunto de resultados, uma vez que pode mudar por causa da onde as condições, as ordens e os grupos. Ele precisa estar no contexto.

Claro que, se todas as suas linhas são seqüenciais, com ids incrementais, nenhum é excluído, e você sabe que o primeiro eo último ids; então você poderia usar uma contagem e com a matemática simples obter a posição sem consultar tudo .... mas eu duvido que é o seu caso, nunca é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top