Índice de um registro em uma tabela
-
03-07-2019 - |
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
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 é.