Question

J'aimerais 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. Autant que je sache, le LIMIT de MySQL requiert à la fois une limite et un décalage. Y a-t-il un moyen de le faire?

Était-ce utile?

La solution

Extrait du Manuel MySQL sur LIMIT :

  

Pour récupérer toutes les lignes d'un certain   compenser jusqu'à la fin du résultat   ensemble, vous pouvez utiliser un grand nombre pour   le deuxième paramètre. Cette déclaration   récupère toutes les lignes de la 96ème ligne   jusqu'au dernier:

SELECT * FROM tbl LIMIT 95, 18446744073709551615;

Autres conseils

Comme vous l'avez dit, LIMIT est obligatoire. Vous devez donc utiliser la plus grande limite possible, à savoir 18446744073709551615 (maximum de BIGINT non signé)

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5

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? En fait, que feriez-vous si vous aviez 1 000 000 000 de disques?

Vous voulez peut-être plus d'un milliard d'enregistrements, mais ce que je veux dire, c'est que le nombre que vous voulez est limité, et qu'il est inférieur à 18 quintillions. Par souci de stabilité, d’optimisation et éventuellement de facilité d’utilisation, je suggère de limiter de manière significative la requête. Cela réduirait également la confusion pour ceux qui n’ont jamais vu ce chiffre magique et qui présentent l’avantage supplémentaire de communiquer au moins le nombre d’enregistrements que vous êtes prêt à gérer simultanément.

Si vous devez vraiment extraire les 18 milliards de disques de votre base de données, vous voulez peut-être les récupérer par incréments de 100 millions et les boucler 184 milliards de fois.

Une autre approche consiste à sélectionner une colonne auto-incrémentée, puis à la filtrer à l'aide de HAVING.

SET @a := 0; 
select @a:=@a + 1 AS counter, table.* FROM table 
HAVING counter > 4

Mais je resterais probablement dans l’approche de la limite supérieure.

Seulement aujourd'hui, je lisais sur le meilleur moyen d’obtenir d’énormes quantités de données (plus d’un million de lignes) d’une table mysql. Une solution consiste, comme suggéré, à utiliser LIMIT x, y x correspond au décalage et y à la dernière ligne à retourner. Cependant, comme je l'ai découvert, ce n'est pas le moyen le plus efficace de le faire. Si vous avez une colonne auto-incrémentée, vous pouvez également utiliser une instruction SELECT avec une clause WHERE indiquant à partir de quel enregistrement vous souhaitez démarrer.

Par exemple,      SELECT * FROM nom_table WHERE id > x;

Il semble que mysql obtienne tous les résultats lorsque vous utilisez LIMIT et ne vous affiche ensuite que les enregistrements qui entrent dans le décalage: ce n’est pas le meilleur en termes de performances.

Source: réponse à cette question Forums MySQL . Il suffit de prendre note, la question est d'environ 6 ans.

Vous pouvez utiliser une instruction MySQL avec LIMIT:

START TRANSACTION;
SET @my_offset = 5;
SET @rows = (SELECT COUNT(*) FROM my_table);
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
EXECUTE statement USING @rows, @my_offset;
COMMIT;

Testé dans MySQL 5.5.44. Ainsi, nous pouvons éviter l’insertion du numéro 18446744073709551615.

remarque: la transaction s'assure que la variable @rows est en accord avec la table considérée dans l'exécution de l'instruction.

Je sais que c'est vieux, mais je n'ai pas vu de réponse similaire, donc c'est la solution que j'utiliserais.

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:

SELECT COUNT(*) FROM table_name;

Ensuite, je construisais ma requête en utilisant le résultat obtenu comme étant ma limite (puisqu'il s'agit du nombre maximal de lignes que la table peut éventuellement renvoyer). Quelque chose comme:

SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;

Ou peut-être quelque chose comme:

SELECT * FROM table_name LIMIT desired_offset, count_result;

Bien sûr, si nécessaire, vous pouvez soustraire désiré_offset à count_result pour obtenir une valeur réelle et précise à fournir comme limite. Passage au "18446744073709551610" la valeur n'a tout simplement aucun sens si je peux réellement déterminer une limite appropriée à fournir.

WHERE .... AND id > <YOUROFFSET>

id peut être n'importe quelle colonne à incrémentation automatique ou numérique unique que vous avez ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top