Pergunta

Espero não estou escrevendo um duplicado, mas eu não encontrei qualquer coisa que responde a minha pergunta. (Embora me parece ser um problema bastante comum.)

O problema ocorre em quase todos os projetos web: Você tem uma tabela com muitas muitas entradas e quer que eles sejam exibidos em páginas individuais.

Agora eu me pergunto qual é a melhor maneira de calcular o número de páginas necessárias para um determinado conjunto de linhas da tabela.

Aqui algumas abordagens eu estive pensando. Eu gostaria de obter alguma resposta sobre a forma como eles são eficazes. Vou dar exemplos específicos de PHP, mas eu aposto que existem técnicas semelhantes em outras línguas.

  1. A provavelmente melhor maneira é para salvar o número de páginas estaticamente e modificar o valor cada vez que uma nova entrada é adicionada. (No entanto ... Eu estou procurando uma solução dinâmica :-))

  2. Faça um SELECT COUNT(*) sobre as linhas de interesse e calcular o número da página a cada vez que a página é exibida.

  3. Faça um ordinária escolha para obter um conjunto de resultados para todas as linhas. Agora não carregar as linhas chamando mysql_fetch_row ou assim, mas obter o número de linhas com mysql_num_rows. (Desde que eu não tenho nenhuma idéia de como isso é implementado Eu não posso dizer se é eficaz ou não. Quem sabe?) Então eu poderia confortavelmente mover o ponteiro conjunto de resultados. (Para mysqlimysql_data_seek, mas a extensão MySQL nativa não tem função similar. Portanto, eu supor que este é apenas um comportamento de buffer de mysqli)

Alguém pode dizer como contar o número de linhas (número de páginas) de forma mais eficaz?

Foi útil?

Solução

Número 2 é o padrão mais comum

select count(*) from [Table] where [Expressions]

E, em seguida,

select [Columns] from [Table] where [Expressions] limit [Pagesize] offset [Pagenum*Pagesize-Pagesize]

Isto dá-lhe o total de linhas para todo o conjunto de resultados, mas apenas os dados das linhas para a página atual.

Muitas estruturas ou CMSes têm convenções para cache de certas partes de dados na sessão que você pode ou-não querem fazer dependendo o esperado tamanhos de mesa, a volatilidade dos dados, etc.

Outras dicas

Se você realmente queria algo de proporções WTF Verdadeiramente, você pode sempre manter o controle de quantas linhas foram incrementando alguns registrar usando um disparador em insert / delete.

Mas eu acho que isso é uma resposta pedindo ainda mais perguntas;).

Basta usar SELECT COUNT se você tiver que. Se seu lento, isso significa que seu banco de dados é construído errada normalmente.

Além disso, tenho a sensação de que é otimização prematura rastejando aqui. Não otimizar prematuramente. Torná-lo faz sentido, e depois torná-lo faz sentido melhor. Faz sentido?

Se bem entendi, na maioria dos sistemas eu trabalhei em que eu precisava o número de páginas ao mesmo tempo como eu estou pegando um novo conjunto de linhas para uma página. Isso permite que uma exibição de "página N de M" ou algo parecido como o título, e uma tela cheia de entradas.

O banco de dados dependente, mas geralmente você passar no número current_page (ou número de linha), em seguida, fazer uma "consulta limitada" (FetchSize, superior, etc.) para obter o próximo conjunto de linhas e um número total de páginas. Concedido fica feio se o número de linhas está mudando por baixo, mas eu normalmente não se preocupe com isso.

Paul.

Eu acho que você quer construir a sua navegação em torno de uma única consulta SQL que modifica apenas a palavra-chave LIMIT. Por exemplo SELECT * FROM myTable LIMIT 0,20 retornará as primeiras 20 linhas. No seu script PHP para a página 2, então você vai definir a consulta SQL para ser SELECT * FROM MyTable LIMIT 20,40 retornando, assim, linhas de 20 a 40. É isso que você estava procurando?

A navegação pode ser construído com o seu script PHP simplesmente fazendo um SELECT COUNT (*) / rowsPerPage e looping, assim, uma estrutura de código até encontrar o número total de linhas. A consulta final seria então LIMIT para lastLimit, TotalRowCount.

Edit: para calcular quantas páginas você precisa para calcular todas as linhas que você precisa para definir quantas linhas 1 página pode ter. Você, então, fazer totalRows / MaxPerPage = howManyPagesNeeded

2 questões a considerar neste contexto:

  • como lidar com dados que são atualizados / inseridos enquanto você está vendo?
  • quantos usuários simultâneos será visitar os dados, e a aplicação será capaz de manter-se com o tráfego quando ele busca páginas de dados dinamicamente?

Dependendo das respostas, algumas das outras respostas aqui podem ou não se aplicar.

Você pode querer verificar esta questão , é muito semelhante ao que você está pedindo.

Uma boa maneira de fazer isso é usar SQL_CALC_FOUND_ROWS

Exemplo:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

Mesmo que você está limitando a consulta para 10 resultados, a segunda consulta irá retornar as linhas totais reais que teriam sido devolvidos se você não tivesse usado um limite.

É importante notar que FOUND_ROWS() não é confiável quando se utiliza do MySQL replicação de banco de dados

Na verdade, se você está enchendo uma página web com PHP, é mais fácil de obter apenas a tabela MySQL, colocar os dados em uma matriz e usar um loop for para ir throught os dados como este

for($i=0;$i<count($arrayvar);$i++){}

Com ainda um motor de modelo simples, você pode declarar um bloco dentro de outro bloco e analisar todos os dados em uma linha consequtive.

Hope esse é o tipo de resposta que você está procurando. Eu realmente não estou claro sobre o que você quer dizer com a sua pergunta, mas eu acho que é isso.

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