Je voudrais construire une requête qui affiche tous les résultats dans une table, mais qui est décalée de 5 à partir du début de la table. Pour autant que je sache, MySQL LIMIT
nécessite une limite ainsi qu'un décalage. Y a-t-il un moyen de faire ça?
114
limit 5000, 18446744073709551615
. Vous n'allez pas récupérer 5000 lignes supplémentaires juste pour que votre code soit joli.Réponses:
À partir du manuel MySQL sur LIMIT :
la source
Limit -1
ou avoir l'Limit Null
air assez raisonnable! ou atleast Limit devrait accepter une sous-requête commeselect * from table limit (select count(*) from table)
Comme vous l'avez mentionné, LIMIT est requis, vous devez donc utiliser la plus grande limite possible, qui est 18446744073709551615 (maximum de BIGINT non signé)
la source
Comme indiqué dans d'autres réponses, MySQL suggère d'utiliser 18446744073709551615 comme nombre d'enregistrements dans la limite, mais considérez ceci: que feriez-vous si vous récupériez 18 446 744 073 709 551 615 enregistrements? En fait, que feriez-vous si vous aviez 1 000 000 000 d'enregistrements?
Peut-être voulez-vous plus d'un milliard d'enregistrements, mais ce que je veux dire , c'est qu'il y a une limite au nombre que vous voulez , et c'est moins de 18 quintillions. Pour des raisons de stabilité, d'optimisation et éventuellement de convivialité, je suggérerais de mettre une limite significative à la requête. Cela réduirait également la confusion pour quiconque n'a jamais vu ce nombre magique et aurait l'avantage supplémentaire de communiquer au moins combien d'enregistrements vous êtes prêt à traiter à la fois.
Si vous devez vraiment obtenir les 18 quintillions d'enregistrements de votre base de données, peut-être que vous voulez vraiment les récupérer par incréments de 100 millions et effectuer une boucle 184 milliards de fois.
la source
Une autre approche consisterait à sélectionner une colonne auto-incrémentée, puis à la filtrer à l'aide de HAVING.
Mais je m'en tiendrai probablement à l'approche de limite supérieure.
la source
$sql = 'SET @a :=0 SELECT .....';
Comme d'autres l'ont mentionné, dans le manuel MySQL. Pour y parvenir, vous pouvez utiliser la valeur maximale d'un gros int non signé, c'est-à-dire ce nombre affreux (18446744073709551615). Mais pour le rendre un peu moins compliqué, vous pouvez utiliser l'opérateur binaire tilde "~".
cela fonctionne comme une négation au niveau du bit. Le résultat de "~ 0" est 18446744073709551615.
la source
LIMIT 5, ~0
etLIMIT ~0 OFFSET 5
. Est-ce une fonctionnalité MySQL 8.0?Juste aujourd'hui, je lisais sur la meilleure façon d'obtenir d'énormes quantités de données (plus d'un million de lignes) à partir d'une table mysql. Une façon est, comme suggéré, d'utiliser
LIMIT x,y
oùx
est le décalage ety
la dernière ligne que vous souhaitez renvoyer. Cependant, comme je l'ai découvert, ce n'est pas le moyen le plus efficace de le faire. Si vous avez une colonne d'auto-incrémentation, vous pouvez aussi facilement utiliser uneSELECT
instruction avec uneWHERE
clause indiquant à partir de quel enregistrement vous souhaitez démarrer.Par exemple,
SELECT * FROM table_name WHERE id > x;
Il semble que mysql obtient tous les résultats lorsque vous utilisez
LIMIT
et ne vous montre que les enregistrements qui correspondent à l'offset: pas le meilleur pour les performances.Source: Réponse à cette question Forums MySQL . Prenez juste note, la question est d'environ 6 ans.
la source
Vous pouvez utiliser une instruction MySQL avec LIMIT:
Testé dans MySQL 5.5.44. Ainsi, nous pouvons éviter l'insertion du numéro 18446744073709551615.
note: la transaction s'assure que la variable @rows est en accord avec la table considérée dans l'exécution de l'instruction.
la source
Je sais que c'est vieux mais je n'ai pas vu de réponse similaire, c'est donc la solution que j'utiliserais.
Tout d'abord, j'exécuterais une requête de comptage sur la table pour voir combien d'enregistrements existent. Cette requête est rapide et normalement le temps d'exécution est négligeable. Quelque chose comme:
Ensuite, je créerais ma requête en utilisant le résultat obtenu de count comme limite (puisque c'est le nombre maximum de lignes que la table pourrait éventuellement renvoyer). Quelque chose comme:
Ou peut-être quelque chose comme:
Bien sûr, si nécessaire, vous pouvez soustraire le paramètre souhaité_offset de count_result pour obtenir une valeur réelle et précise à fournir comme limite. Passer la valeur "18446744073709551610" n'a tout simplement pas de sens si je peux réellement déterminer une limite appropriée à fournir.
la source
id peut être n'importe quelle colonne numérique auto-incrémentée ou unique que vous avez ...
la source