Eu gostaria de construir uma consulta que exibe todos os resultados em uma tabela, mas é compensada por 5 desde o início da tabela. Pelo que eu posso dizer, o MySQL LIMIT
requer um limite, bem como um deslocamento. Há alguma maneira de fazer isso?
114
limit 5000, 18446744073709551615
. Você não vai buscar 5000 linhas extras apenas para que seu código fique bonito.Respostas:
Do manual do MySQL em LIMIT :
fonte
Limit -1
ouLimit Null
parece bem razoável! ou pelo menos o Limit deve aceitar uma subconsulta comoselect * from table limit (select count(*) from table)
Como você mencionou, LIMIT é obrigatório, então você precisa usar o maior limite possível, que é 18446744073709551615 (máximo de BIGINT sem sinal)
fonte
Conforme observado em outras respostas, o MySQL sugere usar 18446744073709551615 como o número de registros no limite, mas considere o seguinte: O que você faria se obtivesse 18.446.744.073.709.551.615 registros de volta? Na verdade, o que você faria se tivesse 1.000.000.000 de registros?
Talvez você queira mais de um bilhão de registros, mas meu ponto é que existe um limite para o número que você deseja , e é menos de 18 quintilhões. Por uma questão de estabilidade, otimização e possivelmente usabilidade, sugiro colocar algum limite significativo na consulta. Isso também reduziria a confusão para quem nunca viu aquele número de aparência mágica e teria o benefício adicional de comunicar pelo menos quantos registros você está disposto a lidar de uma vez.
Se você realmente precisa obter todos os 18 quintilhões de registros de seu banco de dados, talvez o que você realmente queira é pegá-los em incrementos de 100 milhões e fazer um loop de 184 bilhões de vezes.
fonte
Outra abordagem seria selecionar uma coluna autoimcrementada e filtrá-la usando HAVING.
Mas provavelmente continuaria com a abordagem de limite alto.
fonte
$sql = 'SET @a :=0 SELECT .....';
Como outros mencionaram, do manual do MySQL. Para conseguir isso, você pode usar o valor máximo de um grande int sem sinal, que é este número terrível (18446744073709551615). Mas para torná-lo um pouco menos confuso, você pode usar o operador til "~" bit a bit.
funciona como uma negação bit a bit. O resultado de "~ 0" é 18446744073709551615.
fonte
LIMIT 5, ~0
eLIMIT ~0 OFFSET 5
. Este é um recurso do MySQL 8.0?Ainda hoje eu estava lendo sobre a melhor maneira de obter grandes quantidades de dados (mais de um milhão de linhas) de uma tabela mysql. Uma maneira é, como sugerido, usar
LIMIT x,y
ondex
está o deslocamento ey
a última linha que você deseja retornar. Porém, como descobri, não é a maneira mais eficiente de fazer isso. Se você tem uma coluna de incremento automático, pode facilmente usar umaSELECT
instrução com umaWHERE
cláusula dizendo de qual registro você gostaria de começar.Por exemplo,
SELECT * FROM table_name WHERE id > x;
Parece que o mysql obtém todos os resultados quando você usa
LIMIT
e só mostra os registros que cabem no deslocamento: não é o melhor para desempenho.Fonte: Resposta a esta pergunta MySQL Forums . Só preste atenção, a pergunta tem cerca de 6 anos.
fonte
Você pode usar uma instrução MySQL com LIMIT:
Testado em MySQL 5.5.44. Assim, podemos evitar a inserção do número 18446744073709551615.
nota: a transação garante que a variável @rows esteja de acordo com a tabela considerada na execução do demonstrativo.
fonte
Eu sei que isso é antigo, mas não vi uma resposta semelhante, então esta é a solução que eu usaria.
Primeiro, eu executaria uma consulta de contagem na tabela para ver quantos registros existem. Esta consulta é rápida e normalmente o tempo de execução é insignificante. Algo como:
Então, eu construiria minha consulta usando o resultado que obtive da contagem como meu limite (já que esse é o número máximo de linhas que a tabela poderia retornar). Algo como:
Ou possivelmente algo como:
Claro, se necessário, você pode subtrair desejado_offset de count_result para obter um valor real e preciso para fornecer como limite. Passar o valor "18446744073709551610" simplesmente não faz sentido se eu puder determinar um limite apropriado a ser fornecido.
fonte
id pode ser qualquer coluna numérica única ou autoincrementada que você tem ...
fonte