2017-02-09 7 views
0

(Exécution de la version nuage MS Azure de MySQL - CleadDB)MySQL LIMIT le renvoi incorect ensemble de lignes

J'ai une requête simple:

SELECT idx, date_added FROM my_table ORDER BY idx ASC LIMIT 100752, 10 

J'attends pour obtenir 10 enregistrements après l'IDX 100752 (si présent). Cependant, je reçois des documents totalement différents à savoir:

enter image description here

J'ai vérifié les dossiers sont présents alors j'ai couru à nouveau la requête, cette fois avec les disques que je connais sont là à savoir: encore

SELECT idx, date_added FROM my_table ORDER BY idx ASC LIMIT 102366, 10 

I Obtenez à nouveau les lignes sans correspondance suivantes.

enter image description here

Je sais que je fais sans doute quelque chose de stupide. Aide appréciée.

EDIT/MISE À JOUR: j'ai suivi quelques-unes des suggestions ci-dessous et testé les résultats en utilisant WHERE prédicat spécifique plutôt que LIMITER fonction. S'il vous plaît voir les résultats ci-dessous. Les deux requêtes devraient retourner le même résultat - ou alors je m'attendrais.

Test 1:

SELECT idx, date_added FROM attachments ORDER BY idx ASC LIMIT 67805, 20 

rendements: enter image description here

ESSAI 2:

SELECT 
    idx, date_added 
FROM attachments 
WHERE 
    idx >=67805 and idx <67825 
ORDER BY idx ASC 

Retours: enter image description here

Je m'attendrais à ce que les deux soient les mêmes mais ce n'est pas le cas.

SOLUTION: LIMIT ne se soucie pas de la clé d'auto-incrémentation primaire. Il se soucie du nombre de lignes (quel que soit leur index) donc même si l'idx est SORTed - quand certaines lignes sont manquantes (ce qui signifie qu'il y a eu des suppressions dans le passé), il compensera les résultats en fonction du nombre de lignes supprimées. Thx tout.

+0

run: 'SELECT max (IDX), COUNT (*) de attachments' et voir les résultats – RIKI

+0

@OTARIKI oui thx, et qui ne retourne rien! WTH? – Milan

+0

@GurV êtes-vous sérieux? – Milan

Répondre

1

Le premier argument à LIMIT est décalé. Il n'est lié à aucune colonne du tableau.

Si vous avez une table, où vous avez inséré rangées puis supprimé quelques lignes au hasard entre alors LIMIT 20, 10 vous ne donnera pas les lignes avec id 20 à 29. Au contraire, il vous donnera 20 à la ligne 29 après la commande de votre table (les lignes supprimées ne jouent aucun rôle ici)

Éditer: S'il n'y a pas ORDER BY alors l'ordre peut être arbitraire. https://stackoverflow.com/a/20050403/1435132

+0

lignes supprimées jouent un rôle - si vous avez supprimé des lignes et ajouté de nouvelles lignes MySQL réutilisera l'espace libre. donc si vous sélectionnez sans ordre, il est possible que ces nouveaux enregistrements ne soient pas à la fin du résultat. –

+0

Oui, s'il n'y a pas 'ORDER BY' alors l'ordre peut être arbitraire. http://stackoverflow.com/a/20050403/1435132 – Sangharsh

+0

.. désolé mais je ne comprends pas comment cela répond à ma question. a) ma requête a ORDER BY et b) vous pouvez clairement voir les lignes étant présentes dans l'écuyer précédent donc votre théorie ne tient pas ici. – Milan

1

Vous pouvez avoir des espaces dans votre colonne idx. C'est-à-dire que certaines valeurs de idx étaient autrefois utilisées mais n'existent plus dans la table.En tant que tel le numéro de ligne n'est pas le même que idx (LIMIT offset, row_count fonctionne sur le numéro de ligne pas idx)

Pourquoi n'essayez-vous pas cette requête à la place?

SELECT 
    idx, date_added 
FROM my_table 
WHERE 
    idx >=100752 and idx <100762 
ORDER BY idx ASC 
+1

Oui, merci pour la solution de requête alternative. Il y a certainement plus d'une façon d'obtenir le résultat. Cependant, je suis intéressé de savoir que Wth fonctionne avec la fonction LIMIT. S'il vous plaît voir mes commentaires à OTARIKI, il peut aider à clarifier le problème. – Milan